bitkeeper revision 1.58 (3e4fd397g-bGBxJD9wOhLIsOYU_Amg)
authorkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Sun, 16 Feb 2003 18:08:23 +0000 (18:08 +0000)
committerkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Sun, 16 Feb 2003 18:08:23 +0000 (18:08 +0000)
Many files:
  Upgraded PCI support to Linux 2.4.20 level.
.del-ide-disk.c.orig~c03665a55006b149:
  Delete: xen-2.4.16/drivers/ide/ide-disk.c.orig

23 files changed:
.rootkeys
xen-2.4.16/arch/i386/pci-dma.c
xen-2.4.16/arch/i386/pci-i386.c
xen-2.4.16/arch/i386/pci-i386.h
xen-2.4.16/arch/i386/pci-irq.c
xen-2.4.16/arch/i386/pci-pc.c
xen-2.4.16/common/kernel.c
xen-2.4.16/common/resource.c
xen-2.4.16/drivers/ide/ide-disk.c.orig [deleted file]
xen-2.4.16/drivers/ide/ide-pci.c
xen-2.4.16/drivers/ide/piix.c
xen-2.4.16/drivers/pci/gen-devlist.c
xen-2.4.16/drivers/pci/names.c
xen-2.4.16/drivers/pci/pci.c
xen-2.4.16/drivers/pci/pci.ids
xen-2.4.16/drivers/pci/proc.c
xen-2.4.16/drivers/pci/quirks.c
xen-2.4.16/drivers/pci/setup-bus.c
xen-2.4.16/drivers/pci/setup-res.c
xen-2.4.16/include/asm-i386/pci.h
xen-2.4.16/include/xeno/config.h
xen-2.4.16/include/xeno/ioport.h
xen-2.4.16/include/xeno/pci.h

index fb5b75b6f1a2989216333b108fcd043c82945096..98a3bb18a84256f152cde9ae9361b30b40a86a66 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
@@ -76,7 +76,6 @@
 3e4a8cb7nMChlro4wvOBo76n__iCFA xen-2.4.16/drivers/char/xen_serial.c
 3ddb79bdhcqD9ebrslr0O0oHqTiiXg xen-2.4.16/drivers/ide/Makefile
 3ddb79bdErDn_WC3G-fWxKNR3viLnA xen-2.4.16/drivers/ide/ide-disk.c
-3e4a8cb7DcFFHW_fG_OHbY_6f3lPWw xen-2.4.16/drivers/ide/ide-disk.c.orig
 3ddb79bdIPNW36FrlId94jTXaW8HoA xen-2.4.16/drivers/ide/ide-dma.c
 3ddb79be5Ysvhn4se_Z-LQY_hI6UPw xen-2.4.16/drivers/ide/ide-features.c
 3ddb79bdh1ohsWYRH_KdaXr7cqs12w xen-2.4.16/drivers/ide/ide-geometry.c
index 7cf3a4ee9d0fe611283dc411f14fee61fca427fc..9d19cea867ca5a82dcd4050cd389c79910c1ac42 100644 (file)
@@ -19,7 +19,7 @@ void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
        void *ret;
        int gfp = GFP_ATOMIC;
 
-       if (hwdev == NULL || hwdev->dma_mask != 0xffffffff)
+       if (hwdev == NULL || ((u32)hwdev->dma_mask < 0xffffffff))
                gfp |= GFP_DMA;
        ret = (void *)__get_free_pages(gfp, get_order(size));
 
index f2e9c43e648b2411a0852b510becdd161a41cd2c..7a213d824cea79bff2f16f8ae68f3eec2b8ee888 100644 (file)
@@ -86,7 +86,7 @@
  */
 
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
@@ -136,7 +136,8 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  * which might have be mirrored at 0x0100-0x03ff..
  */
 void
-pcibios_align_resource(void *data, struct resource *res, unsigned long size)
+pcibios_align_resource(void *data, struct resource *res,
+                      unsigned long size, unsigned long align)
 {
        if (res->flags & IORESOURCE_IO) {
                unsigned long start = res->start;
@@ -303,7 +304,7 @@ void __init pcibios_resource_survey(void)
        pcibios_assign_resources();
 }
 
-int pcibios_enable_resources(struct pci_dev *dev)
+int pcibios_enable_resources(struct pci_dev *dev, int mask)
 {
        u16 cmd, old_cmd;
        int idx;
@@ -312,6 +313,10 @@ int pcibios_enable_resources(struct pci_dev *dev)
        pci_read_config_word(dev, PCI_COMMAND, &cmd);
        old_cmd = cmd;
        for(idx=0; idx<6; idx++) {
+               /* Only set up the requested stuff */
+               if (!(mask & (1<<idx)))
+                       continue;
+                       
                r = &dev->resource[idx];
                if (!r->start && r->end) {
                        printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", dev->slot_name);
@@ -328,7 +333,6 @@ int pcibios_enable_resources(struct pci_dev *dev)
                printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->slot_name, old_cmd, cmd);
                pci_write_config_word(dev, PCI_COMMAND, cmd);
        }
-
        return 0;
 }
 
@@ -348,7 +352,40 @@ void pcibios_set_master(struct pci_dev *dev)
                lat = pcibios_max_latency;
        else
                return;
-       printk("PCI: Setting latency timer of device %s to %d\n", dev->slot_name, lat);
+       printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", dev->slot_name, lat);
        pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
 }
 
+#if 0
+int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+                       enum pci_mmap_state mmap_state, int write_combine)
+{
+       unsigned long prot;
+
+       /* I/O space cannot be accessed via normal processor loads and
+        * stores on this platform.
+        */
+       if (mmap_state == pci_mmap_io)
+               return -EINVAL;
+
+       /* Leave vm_pgoff as-is, the PCI space address is the physical
+        * address on this platform.
+        */
+       vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO);
+
+       prot = pgprot_val(vma->vm_page_prot);
+       if (boot_cpu_data.x86 > 3)
+               prot |= _PAGE_PCD | _PAGE_PWT;
+       vma->vm_page_prot = __pgprot(prot);
+
+       /* Write-combine setting is ignored, it is changed via the mtrr
+        * interfaces on this platform.
+        */
+       if (remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
+                            vma->vm_end - vma->vm_start,
+                            vma->vm_page_prot))
+               return -EAGAIN;
+
+       return 0;
+}
+#endif
index 2c821af08fdef14e60aa227ed42669267d1febb8..2d051c51b2ab97f1211813552e7af361b049a338 100644 (file)
@@ -29,7 +29,7 @@ extern unsigned int pci_probe;
 extern unsigned int pcibios_max_latency;
 
 void pcibios_resource_survey(void);
-int pcibios_enable_resources(struct pci_dev *);
+int pcibios_enable_resources(struct pci_dev *, int);
 
 /* pci-pc.c */
 
index f08f3790bc2712b5536a10fb60e232604fac917e..b7a212b014f813fa653946a8758bd1d6fb5928e3 100644 (file)
@@ -6,7 +6,7 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/slab.h>
@@ -23,6 +23,8 @@
 #define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
 #define PIRQ_VERSION 0x0100
 
+int broken_hp_bios_irq9;
+
 static struct irq_routing_table *pirq_table;
 
 /*
@@ -206,6 +208,24 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i
        return 1;
 }
 
+/*
+ * ITE 8330G pirq rules are nibble-based
+ * FIXME: pirqmap may be { 1, 0, 3, 2 },
+ *       2+3 are both mapped to irq 9 on my system
+ */
+static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
+{
+       static unsigned char pirqmap[4] = { 1, 0, 2, 3 };
+       return read_config_nybble(router,0x43, pirqmap[pirq-1]);
+}
+
+static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
+{
+       static unsigned char pirqmap[4] = { 1, 0, 2, 3 };
+       write_config_nybble(router, 0x43, pirqmap[pirq-1], irq);
+       return 1;
+}
+
 /*
  * OPTI: high four bits are nibble pointer..
  * I wonder what the low bits do?
@@ -226,12 +246,12 @@ static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
  */
 static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
 {
-       return read_config_nybble(router, 0x5C, pirq-1);
+       return read_config_nybble(router, 0x5C, (pirq-1)^1);
 }
 
 static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 {
-       write_config_nybble(router, 0x5C, pirq-1, irq);
+       write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
        return 1;
 }
 
@@ -444,10 +464,19 @@ static struct irq_router pirq_routers[] = {
        { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, pirq_piix_get, pirq_piix_set },
        { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371MX,   pirq_piix_get, pirq_piix_set },
        { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_0, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, pirq_piix_get, pirq_piix_set },
        { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, pirq_piix_get, pirq_piix_set },
+       { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, pirq_piix_get, pirq_piix_set },
 
        { "ALI", PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, pirq_ali_get, pirq_ali_set },
 
+       { "ITE", PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_IT8330G_0, pirq_ite_get, pirq_ite_set },
+
        { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, pirq_via_get, pirq_via_set },
        { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596, pirq_via_get, pirq_via_set },
        { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, pirq_via_get, pirq_via_set },
@@ -463,6 +492,10 @@ static struct irq_router pirq_routers[] = {
          pirq_serverworks_get, pirq_serverworks_set },
        { "AMD756 VIPER", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_740B,
                pirq_amd756_get, pirq_amd756_set },
+       { "AMD766", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7413,
+               pirq_amd756_get, pirq_amd756_set },
+       { "AMD768", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7443,
+               pirq_amd756_get, pirq_amd756_set },
 
        { "default", 0, 0, NULL, NULL }
 };
@@ -566,6 +599,15 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
        DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs);
        mask &= pcibios_irq_mask;
 
+       /* Work around broken HP Pavilion Notebooks which assign USB to
+          IRQ 9 even though it is actually wired to IRQ 11 */
+
+       if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) {
+               dev->irq = 11;
+               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
+               r->set(pirq_router_dev, dev, pirq, 11);
+       }
+
        /*
         * Find the best IRQ to assign: use the one
         * reported by the device if possible.
index 7b02d3f4d3591130a34ce672c97be112b2672f36..d63a54a79c1af54f16f0bb64e5d99e8897b1f917 100644 (file)
@@ -6,17 +6,20 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
 
-//#include <asm/segment.h>
+/*#include <asm/segment.h>*/
 #include <asm/io.h>
+#include <asm/smp.h>
+#include <asm/smpboot.h>
 
 #include "pci-i386.h"
 
+extern int numnodes;
 #define __KERNEL_CS __HYPERVISOR_CS
 #define __KERNEL_DS __HYPERVISOR_DS
 
@@ -29,11 +32,21 @@ struct pci_ops *pci_root_ops = NULL;
 int (*pci_config_read)(int seg, int bus, int dev, int fn, int reg, int len, u32 *value) = NULL;
 int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int len, u32 value) = NULL;
 
+#ifdef CONFIG_MULTIQUAD
+#define BUS2QUAD(global) (mp_bus_id_to_node[global])
+#define BUS2LOCAL(global) (mp_bus_id_to_local[global])
+#define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local])
+#else
+#define BUS2QUAD(global) (0)
+#define BUS2LOCAL(global) (global)
+#define QUADLOCAL2BUS(quad,local) (local)
+#endif
+
 /*
  * This interrupt-safe spinlock protects all accesses to PCI
  * configuration space.
  */
-spinlock_t pci_config_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t pci_config_lock = SPIN_LOCK_UNLOCKED;
 
 
 /*
@@ -42,14 +55,137 @@ spinlock_t pci_config_lock = SPIN_LOCK_UNLOCKED;
 
 #ifdef CONFIG_PCI_DIRECT
 
+#ifdef CONFIG_MULTIQUAD
+#define PCI_CONF1_ADDRESS(bus, dev, fn, reg) \
+       (0x80000000 | (BUS2LOCAL(bus) << 16) | (dev << 11) | (fn << 8) | (reg & ~3))
+
+static int pci_conf1_mq_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) /* CONFIG_MULTIQUAD */
+{
+       unsigned long flags;
+
+       if (bus > 255 || dev > 31 || fn > 7 || reg > 255)
+               return -EINVAL;
+
+       spin_lock_irqsave(&pci_config_lock, flags);
+
+       outl_quad(PCI_CONF1_ADDRESS(bus, dev, fn, reg), 0xCF8, BUS2QUAD(bus));
+
+       switch (len) {
+       case 1:
+               *value = inb_quad(0xCFC + (reg & 3), BUS2QUAD(bus));
+               break;
+       case 2:
+               *value = inw_quad(0xCFC + (reg & 2), BUS2QUAD(bus));
+               break;
+       case 4:
+               *value = inl_quad(0xCFC, BUS2QUAD(bus));
+               break;
+       }
+
+       spin_unlock_irqrestore(&pci_config_lock, flags);
+
+       return 0;
+}
+
+static int pci_conf1_mq_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) /* CONFIG_MULTIQUAD */
+{
+       unsigned long flags;
+
+       if (bus > 255 || dev > 31 || fn > 7 || reg > 255) 
+               return -EINVAL;
+
+       spin_lock_irqsave(&pci_config_lock, flags);
+
+       outl_quad(PCI_CONF1_ADDRESS(bus, dev, fn, reg), 0xCF8, BUS2QUAD(bus));
+
+       switch (len) {
+       case 1:
+               outb_quad((u8)value, 0xCFC + (reg & 3), BUS2QUAD(bus));
+               break;
+       case 2:
+               outw_quad((u16)value, 0xCFC + (reg & 2), BUS2QUAD(bus));
+               break;
+       case 4:
+               outl_quad((u32)value, 0xCFC, BUS2QUAD(bus));
+               break;
+       }
+
+       spin_unlock_irqrestore(&pci_config_lock, flags);
+
+       return 0;
+}
+
+static int pci_conf1_read_mq_config_byte(struct pci_dev *dev, int where, u8 *value)
+{
+       int result; 
+       u32 data;
+
+       result = pci_conf1_mq_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 1, &data);
+
+       *value = (u8)data;
+
+       return result;
+}
+
+static int pci_conf1_read_mq_config_word(struct pci_dev *dev, int where, u16 *value)
+{
+       int result; 
+       u32 data;
+
+       result = pci_conf1_mq_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 2, &data);
+
+       *value = (u16)data;
+
+       return result;
+}
+
+static int pci_conf1_read_mq_config_dword(struct pci_dev *dev, int where, u32 *value)
+{
+       if (!value) 
+               return -EINVAL;
+
+       return pci_conf1_mq_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 4, value);
+}
+
+static int pci_conf1_write_mq_config_byte(struct pci_dev *dev, int where, u8 value)
+{
+       return pci_conf1_mq_write(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 1, value);
+}
+
+static int pci_conf1_write_mq_config_word(struct pci_dev *dev, int where, u16 value)
+{
+       return pci_conf1_mq_write(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 2, value);
+}
+
+static int pci_conf1_write_mq_config_dword(struct pci_dev *dev, int where, u32 value)
+{
+       return pci_conf1_mq_write(0, dev->bus->number, PCI_SLOT(dev->devfn), 
+               PCI_FUNC(dev->devfn), where, 4, value);
+}
+
+static struct pci_ops pci_direct_mq_conf1 = {
+       pci_conf1_read_mq_config_byte,
+       pci_conf1_read_mq_config_word,
+       pci_conf1_read_mq_config_dword,
+       pci_conf1_write_mq_config_byte,
+       pci_conf1_write_mq_config_word,
+       pci_conf1_write_mq_config_dword
+};
+
+#endif /* !CONFIG_MULTIQUAD */
 #define PCI_CONF1_ADDRESS(bus, dev, fn, reg) \
        (0x80000000 | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3))
 
-static int pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value)
+static int pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) /* !CONFIG_MULTIQUAD */
 {
        unsigned long flags;
 
-       if (!value || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
+       if (bus > 255 || dev > 31 || fn > 7 || reg > 255)
                return -EINVAL;
 
        spin_lock_irqsave(&pci_config_lock, flags);
@@ -73,11 +209,11 @@ static int pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len,
        return 0;
 }
 
-static int pci_conf1_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value)
+static int pci_conf1_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) /* !CONFIG_MULTIQUAD */
 {
        unsigned long flags;
 
-       if ((bus > 255) || (dev > 31) || (fn > 7) || (reg > 255)) 
+       if ((bus > 255 || dev > 31 || fn > 7 || reg > 255)) 
                return -EINVAL;
 
        spin_lock_irqsave(&pci_config_lock, flags);
@@ -108,9 +244,6 @@ static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value)
        int result; 
        u32 data;
 
-       if (!value) 
-               return -EINVAL;
-
        result = pci_conf1_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 1, &data);
 
@@ -124,9 +257,6 @@ static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value
        int result; 
        u32 data;
 
-       if (!value) 
-               return -EINVAL;
-
        result = pci_conf1_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 2, &data);
 
@@ -137,9 +267,6 @@ static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value
 
 static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value)
 {
-       if (!value) 
-               return -EINVAL;
-
        return pci_conf1_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 4, value);
 }
@@ -182,7 +309,7 @@ static int pci_conf2_read (int seg, int bus, int dev, int fn, int reg, int len,
 {
        unsigned long flags;
 
-       if (!value || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
+       if (bus > 255 || dev > 31 || fn > 7 || reg > 255)
                return -EINVAL;
 
        if (dev & 0x10) 
@@ -216,7 +343,7 @@ static int pci_conf2_write (int seg, int bus, int dev, int fn, int reg, int len,
 {
        unsigned long flags;
 
-       if ((bus > 255) || (dev > 31) || (fn > 7) || (reg > 255)) 
+       if ((bus > 255 || dev > 31 || fn > 7 || reg > 255)) 
                return -EINVAL;
 
        if (dev & 0x10) 
@@ -350,8 +477,14 @@ static struct pci_ops * __devinit pci_check_direct(void)
                    pci_sanity_check(&pci_direct_conf1)) {
                        outl (tmp, 0xCF8);
                        __restore_flags(flags);
-                       printk("PCI: Using configuration type 1\n");
+                       printk(KERN_INFO "PCI: Using configuration type 1\n");
                        request_region(0xCF8, 8, "PCI conf1");
+
+#ifdef CONFIG_MULTIQUAD                        
+                       /* Multi-Quad has an extended PCI Conf1 */
+                       if(clustered_apic_mode == CLUSTERED_APIC_NUMAQ)
+                               return &pci_direct_mq_conf1;
+#endif                         
                        return &pci_direct_conf1;
                }
                outl (tmp, 0xCF8);
@@ -367,7 +500,7 @@ static struct pci_ops * __devinit pci_check_direct(void)
                if (inb (0xCF8) == 0x00 && inb (0xCFA) == 0x00 &&
                    pci_sanity_check(&pci_direct_conf2)) {
                        __restore_flags(flags);
-                       printk("PCI: Using configuration type 2\n");
+                       printk(KERN_INFO "PCI: Using configuration type 2\n");
                        request_region(0xCF8, 4, "PCI conf2");
                        return &pci_direct_conf2;
                }
@@ -475,10 +608,10 @@ static unsigned long bios32_service(unsigned long service)
                case 0:
                        return address + entry;
                case 0x80:      /* Not present */
-                       printk("bios32_service(0x%lx): not present\n", service);
+                       printk(KERN_WARNING "bios32_service(0x%lx): not present\n", service);
                        return 0;
                default: /* Shouldn't happen */
-                       printk("bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n",
+                       printk(KERN_WARNING "bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n",
                                service, return_code);
                        return 0;
        }
@@ -528,7 +661,7 @@ static int __devinit check_pcibios(void)
                                status, signature);
                        return 0;
                }
-               printk("PCI: PCI BIOS revision %x.%02x entry at 0x%lx, last bus=%d\n",
+               printk(KERN_INFO "PCI: PCI BIOS revision %x.%02x entry at 0x%lx, last bus=%d\n",
                        major_ver, minor_ver, pcibios_entry, pcibios_last_bus);
 #ifdef CONFIG_PCI_DIRECT
                if (!(hw_mech & PCIBIOS_HW_TYPE1))
@@ -569,7 +702,7 @@ static int pci_bios_read (int seg, int bus, int dev, int fn, int reg, int len, u
        unsigned long flags;
        unsigned long bx = ((bus << 8) | (dev << 3) | fn);
 
-       if (!value || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
+       if (bus > 255 || dev > 31 || fn > 7 || reg > 255)
                return -EINVAL;
 
        spin_lock_irqsave(&pci_config_lock, flags);
@@ -624,7 +757,7 @@ static int pci_bios_write (int seg, int bus, int dev, int fn, int reg, int len,
        unsigned long flags;
        unsigned long bx = ((bus << 8) | (dev << 3) | fn);
 
-       if ((bus > 255) || (dev > 31) || (fn > 7) || (reg > 255)) 
+       if ((bus > 255 || dev > 31 || fn > 7 || reg > 255)) 
                return -EINVAL;
 
        spin_lock_irqsave(&pci_config_lock, flags);
@@ -679,7 +812,7 @@ static int pci_bios_read_config_byte(struct pci_dev *dev, int where, u8 *value)
        u32 data;
 
        if (!value) 
-               return -EINVAL;
+               BUG();
 
        result = pci_bios_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 1, &data);
@@ -695,7 +828,7 @@ static int pci_bios_read_config_word(struct pci_dev *dev, int where, u16 *value)
        u32 data;
 
        if (!value) 
-               return -EINVAL;
+               BUG();
 
        result = pci_bios_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 2, &data);
@@ -708,7 +841,7 @@ static int pci_bios_read_config_word(struct pci_dev *dev, int where, u16 *value)
 static int pci_bios_read_config_dword(struct pci_dev *dev, int where, u32 *value)
 {
        if (!value) 
-               return -EINVAL;
+               BUG();
        
        return pci_bios_read(0, dev->bus->number, PCI_SLOT(dev->devfn), 
                PCI_FUNC(dev->devfn), where, 4, value);
@@ -830,7 +963,7 @@ static void __devinit pcibios_sort(void)
                                }
                        }
                        if (ln == &pci_devices) {
-                               printk("PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
+                               printk(KERN_WARNING "PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
                                /*
                                 * We must not continue scanning as several buggy BIOSes
                                 * return garbage after the last device. Grr.
@@ -839,7 +972,7 @@ static void __devinit pcibios_sort(void)
                        }
                }
                if (!found) {
-                       printk("PCI: Device %02x:%02x not found by BIOS\n",
+                       printk(KERN_WARNING "PCI: Device %02x:%02x not found by BIOS\n",
                                dev->bus->number, dev->devfn);
                        list_del(&dev->global_list);
                        list_add_tail(&dev->global_list, &sorted_devices);
@@ -899,7 +1032,7 @@ struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void)
                        rt->size = opt.size + sizeof(struct irq_routing_table);
                        rt->exclusive_irqs = map;
                        memcpy(rt->slots, (void *) page, opt.size);
-                       printk("PCI: Using BIOS Interrupt Routing Table\n");
+                       printk(KERN_INFO "PCI: Using BIOS Interrupt Routing Table\n");
                }
        }
        free_page(page);
@@ -964,7 +1097,7 @@ static void __devinit pcibios_fixup_ghosts(struct pci_bus *b)
        }
        if (!seen_host_bridge)
                return;
-       printk("PCI: Ignoring ghost devices on bus %02x\n", b->number);
+       printk(KERN_WARNING "PCI: Ignoring ghost devices on bus %02x\n", b->number);
 
        ln = &b->devices;
        while (ln->next != &b->devices) {
@@ -1002,7 +1135,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
                        if (!pci_read_config_word(&dev, PCI_VENDOR_ID, &l) &&
                            l != 0x0000 && l != 0xffff) {
                                DBG("Found device at %02x:%02x [%04x]\n", n, dev.devfn, l);
-                               printk("PCI: Discovered peer bus %02x\n", n);
+                               printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
                                pci_scan_bus(n, pci_root_ops, NULL);
                                break;
                        }
@@ -1020,6 +1153,9 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)
         */
        int pxb, reg;
        u8 busno, suba, subb;
+#ifdef CONFIG_MULTIQUAD
+       int quad = BUS2QUAD(d->bus->number);
+#endif
        printk("PCI: Searching for i450NX host bridges on %s\n", d->slot_name);
        reg = 0xd0;
        for(pxb=0; pxb<2; pxb++) {
@@ -1028,9 +1164,9 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)
                pci_read_config_byte(d, reg++, &subb);
                DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
                if (busno)
-                       pci_scan_bus(busno, pci_root_ops, NULL);        /* Bus A */
+                       pci_scan_bus(QUADLOCAL2BUS(quad,busno), pci_root_ops, NULL);    /* Bus A */
                if (suba < subb)
-                       pci_scan_bus(suba+1, pci_root_ops, NULL);       /* Bus B */
+                       pci_scan_bus(QUADLOCAL2BUS(quad,suba+1), pci_root_ops, NULL);   /* Bus B */
        }
        pcibios_last_bus = -1;
 }
@@ -1043,7 +1179,7 @@ static void __devinit pci_fixup_i450gx(struct pci_dev *d)
         */
        u8 busno;
        pci_read_config_byte(d, 0x4a, &busno);
-       printk("PCI: i440KX/GX host bridge %s: secondary bus %02x\n", d->slot_name, busno);
+       printk(KERN_INFO "PCI: i440KX/GX host bridge %s: secondary bus %02x\n", d->slot_name, busno);
        pci_scan_bus(busno, pci_root_ops, NULL);
        pcibios_last_bus = -1;
 }
@@ -1056,11 +1192,23 @@ static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)
         */
        int i;
 
-       printk("PCI: Fixing base address flags for device %s\n", d->slot_name);
+       printk(KERN_WARNING "PCI: Fixing base address flags for device %s\n", d->slot_name);
        for(i=0; i<4; i++)
                d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
 }
 
+static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d)
+{
+       /*
+        * NCR 53C810 returns class code 0 (at least on some systems).
+        * Fix class to be PCI_CLASS_STORAGE_SCSI
+        */
+       if (!d->class) {
+               printk("PCI: fixing NCR 53C810 class code for %s\n", d->slot_name);
+               d->class = PCI_CLASS_STORAGE_SCSI << 8;
+       }
+}
+
 static void __devinit pci_fixup_ide_bases(struct pci_dev *d)
 {
        int i;
@@ -1112,25 +1260,74 @@ static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d)
 }
 
 /*
- * Nobody seems to know what this does. Damn.
- *
- * But it does seem to fix some unspecified problem
- * with 'movntq' copies on Athlons.
- *
- * VIA 8363 chipset:
- *  - bit 7 at offset 0x55: Debug (RW)
+ * Addresses issues with problems in the memory write queue timer in
+ * certain VIA Northbridges.  This bugfix is per VIA's specifications,
+ * except for the KL133/KM133: clearing bit 5 on those Northbridges seems
+ * to trigger a bug in its integrated ProSavage video card, which
+ * causes screen corruption.  We only clear bits 6 and 7 for that chipset,
+ * until VIA can provide us with definitive information on why screen
+ * corruption occurs, and what exactly those bits do.
+ * 
+ * VIA 8363,8622,8361 Northbridges:
+ *  - bits  5, 6, 7 at offset 0x55 need to be turned off
+ * VIA 8367 (KT266x) Northbridges:
+ *  - bits  5, 6, 7 at offset 0x95 need to be turned off
+ * VIA 8363 rev 0x81/0x84 (KL133/KM133) Northbridges:
+ *  - bits     6, 7 at offset 0x55 need to be turned off
  */
-static void __init pci_fixup_via_athlon_bug(struct pci_dev *d)
+
+#define VIA_8363_KL133_REVISION_ID 0x81
+#define VIA_8363_KM133_REVISION_ID 0x84
+
+static void __init pci_fixup_via_northbridge_bug(struct pci_dev *d)
 {
        u8 v;
-       pci_read_config_byte(d, 0x55, &v);
-       if (v & 0x80) {
-               printk("Trying to stomp on Athlon bug...\n");
-               v &= 0x7f; /* clear bit 55.7 */
-               pci_write_config_byte(d, 0x55, v);
+       u8 revision;
+       int where = 0x55;
+       int mask = 0x1f; /* clear bits 5, 6, 7 by default */
+
+       pci_read_config_byte(d, PCI_REVISION_ID, &revision);
+       
+       if (d->device == PCI_DEVICE_ID_VIA_8367_0) {
+               /* fix pci bus latency issues resulted by NB bios error
+                  it appears on bug free^Wreduced kt266x's bios forces
+                  NB latency to zero */
+               pci_write_config_byte(d, PCI_LATENCY_TIMER, 0);
+
+               where = 0x95; /* the memory write queue timer register is 
+                                different for the KT266x's: 0x95 not 0x55 */
+       } else if (d->device == PCI_DEVICE_ID_VIA_8363_0 &&
+                  (revision == VIA_8363_KL133_REVISION_ID || 
+                   revision == VIA_8363_KM133_REVISION_ID)) {
+               mask = 0x3f; /* clear only bits 6 and 7; clearing bit 5
+                               causes screen corruption on the KL133/KM133 */
+       }
+
+       pci_read_config_byte(d, where, &v);
+       if (v & ~mask) {
+               printk("Disabling VIA memory write queue (PCI ID %04x, rev %02x): [%02x] %02x & %02x -> %02x\n", \
+                       d->device, revision, where, v, mask, v & mask);
+               v &= mask;
+               pci_write_config_byte(d, where, v);
        }
 }
 
+/*
+ * For some reasons Intel decided that certain parts of their
+ * 815, 845 and some other chipsets must look like PCI-to-PCI bridges
+ * while they are obviously not. The 82801 family (AA, AB, BAM/CAM,
+ * BA/CA/DB and E) PCI bridges are actually HUB-to-PCI ones, according
+ * to Intel terminology. These devices do forward all addresses from
+ * system to PCI bus no matter what are their window settings, so they are
+ * "transparent" (or subtractive decoding) from programmers point of view.
+ */
+static void __init pci_fixup_transparent_bridge(struct pci_dev *dev)
+{
+       if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
+           (dev->device & 0xff00) == 0x2400)
+               dev->transparent = 1;
+}
+
 struct pci_fixup pcibios_fixups[] = {
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82451NX,    pci_fixup_i450nx },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82454GX,    pci_fixup_i450gx },
@@ -1140,7 +1337,12 @@ struct pci_fixup pcibios_fixups[] = {
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_SI,       PCI_DEVICE_ID_SI_5597,          pci_fixup_latency },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_SI,       PCI_DEVICE_ID_SI_5598,          pci_fixup_latency },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82371AB_3,  pci_fixup_piix4_acpi },
-       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8363_0,       pci_fixup_via_athlon_bug },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8363_0,       pci_fixup_via_northbridge_bug },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8622,         pci_fixup_via_northbridge_bug },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8361,         pci_fixup_via_northbridge_bug },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8367_0,       pci_fixup_via_northbridge_bug },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_NCR,      PCI_DEVICE_ID_NCR_53C810,       pci_fixup_ncr53c810 },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_ANY_ID,                     pci_fixup_transparent_bridge },
        { 0 }
 };
 
@@ -1163,6 +1365,11 @@ void __devinit pcibios_config_init(void)
         * both PCI BIOS and direct access, with a preference for direct.
         */
 
+#ifdef CONFIG_PCI_DIRECT
+       struct pci_ops *tmp = NULL;
+#endif
+
+
 #ifdef CONFIG_PCI_BIOS
        if ((pci_probe & PCI_PROBE_BIOS) 
                && ((pci_root_ops = pci_find_bios()))) {
@@ -1175,7 +1382,8 @@ void __devinit pcibios_config_init(void)
 
 #ifdef CONFIG_PCI_DIRECT
        if ((pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2)) 
-               && (pci_root_ops = pci_check_direct())) {
+               && (tmp = pci_check_direct())) {
+               pci_root_ops = tmp;
                if (pci_root_ops == &pci_direct_conf1) {
                        pci_config_read = pci_conf1_read;
                        pci_config_write = pci_conf1_write;
@@ -1192,15 +1400,25 @@ void __devinit pcibios_config_init(void)
 
 void __init pcibios_init(void)
 {
+       int quad;
+
        if (!pci_root_ops)
                pcibios_config_init();
        if (!pci_root_ops) {
-               printk("PCI: System does not support PCI\n");
+               printk(KERN_WARNING "PCI: System does not support PCI\n");
                return;
        }
 
-       printk("PCI: Probing PCI hardware\n");
+       printk(KERN_INFO "PCI: Probing PCI hardware\n");
        pci_root_bus = pci_scan_bus(0, pci_root_ops, NULL);
+       if (clustered_apic_mode && (numnodes > 1)) {
+               for (quad = 1; quad < numnodes; ++quad) {
+                       printk("Scanning PCI bus %d for quad %d\n", 
+                               QUADLOCAL2BUS(quad,0), quad);
+                       pci_scan_bus(QUADLOCAL2BUS(quad,0), 
+                               pci_root_ops, NULL);
+               }
+       }
 
        pcibios_irq_init();
        pcibios_fixup_peer_bridges();
@@ -1265,11 +1483,11 @@ unsigned int pcibios_assign_all_busses(void)
        return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0;
 }
 
-int pcibios_enable_device(struct pci_dev *dev)
+int pcibios_enable_device(struct pci_dev *dev, int mask)
 {
        int err;
 
-       if ((err = pcibios_enable_resources(dev)) < 0)
+       if ((err = pcibios_enable_resources(dev, mask)) < 0)
                return err;
        pcibios_enable_irq(dev);
        return 0;
index 8a8c8ddd51eb0230720eb42294ec63c4308b789a..eaab8e940b1889367d025c910542b36e6f06181e 100644 (file)
@@ -506,3 +506,10 @@ long do_console_write(char *str, int count)
     
     return(0);
 }
+
+void __out_of_line_bug(int line)
+{
+    printk("kernel BUG in header file at line %d\n", line);
+    BUG();
+    for ( ; ; ) continue;
+}
index 15f29999ff743f60281f6c9bfa03a59947746c3c..406fb256a75a44007e68b6a06ec328b46f929ce3 100644 (file)
@@ -154,7 +154,8 @@ static int find_resource(struct resource *root, struct resource *new,
                         unsigned long size,
                         unsigned long min, unsigned long max,
                         unsigned long align,
-                        void (*alignf)(void *, struct resource *, unsigned long),
+                        void (*alignf)(void *, struct resource *,
+                                       unsigned long, unsigned long),
                         void *alignf_data)
 {
        struct resource *this = root->child;
@@ -171,7 +172,7 @@ static int find_resource(struct resource *root, struct resource *new,
                        new->end = max;
                new->start = (new->start + align - 1) & ~(align - 1);
                if (alignf)
-                       alignf(alignf_data, new, size);
+                       alignf(alignf_data, new, size, align);
                if (new->start < new->end && new->end - new->start + 1 >= size) {
                        new->end = new->start + size - 1;
                        return 0;
@@ -191,7 +192,8 @@ int allocate_resource(struct resource *root, struct resource *new,
                      unsigned long size,
                      unsigned long min, unsigned long max,
                      unsigned long align,
-                     void (*alignf)(void *, struct resource *, unsigned long),
+                     void (*alignf)(void *, struct resource *,
+                                    unsigned long, unsigned long),
                      void *alignf_data)
 {
        int err;
@@ -293,6 +295,7 @@ void __release_region(struct resource *parent, unsigned long start, unsigned lon
        printk("Trying to free nonexistent resource <%08lx-%08lx>\n", start, end);
 }
 
+
 #if 0
 /*
  * Called from init/main.c to reserve IO ports.
diff --git a/xen-2.4.16/drivers/ide/ide-disk.c.orig b/xen-2.4.16/drivers/ide/ide-disk.c.orig
deleted file mode 100644 (file)
index 984e53c..0000000
+++ /dev/null
@@ -1,1550 +0,0 @@
-/*
- *  linux/drivers/ide/ide-disk.c       Version 1.10    June 9, 2000
- *
- *  Copyright (C) 1994-1998  Linus Torvalds & authors (see below)
- */
-
-/*
- *  Mostly written by Mark Lord <mlord@pobox.com>
- *                and Gadi Oxman <gadio@netvision.net.il>
- *                and Andre Hedrick <andre@linux-ide.org>
- *
- * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c.
- *
- * Version 1.00                move disk only code from ide.c to ide-disk.c
- *                     support optional byte-swapping of all data
- * Version 1.01                fix previous byte-swapping code
- * Version 1.02                remove ", LBA" from drive identification msgs
- * Version 1.03                fix display of id->buf_size for big-endian
- * Version 1.04                add /proc configurable settings and S.M.A.R.T support
- * Version 1.05                add capacity support for ATA3 >= 8GB
- * Version 1.06                get boot-up messages to show full cyl count
- * Version 1.07                disable door-locking if it fails
- * Version 1.08                fixed CHS/LBA translations for ATA4 > 8GB,
- *                     process of adding new ATA4 compliance.
- *                     fixed problems in allowing fdisk to see
- *                     the entire disk.
- * Version 1.09                added increment of rq->sector in ide_multwrite
- *                     added UDMA 3/4 reporting
- * Version 1.10                request queue changes, Ultra DMA 100
- * Version 1.11                added 48-bit lba
- * Version 1.12                adding taskfile io access method
- */
-
-#define IDEDISK_VERSION        "1.12"
-
-#undef REALLY_SLOW_IO          /* most systems can safely undef this */
-
-#include <xeno/config.h>
-#include <xeno/module.h>
-#include <xeno/types.h>
-#include <xeno/lib.h>
-#include <xeno/timer.h>
-#include <xeno/mm.h>
-#include <xeno/interrupt.h>
-#include <xeno/major.h>
-#include <xeno/errno.h>
-#include <xeno/genhd.h>
-#include <xeno/slab.h>
-#include <xeno/delay.h>
-#include <xeno/ide.h>
-
-#include <asm/byteorder.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_BLK_DEV_PDC4030
-#define IS_PDC4030_DRIVE (HWIF(drive)->chipset == ide_pdc4030)
-#else
-#define IS_PDC4030_DRIVE (0)   /* auto-NULLs out pdc4030 code */
-#endif
-
-#ifdef CONFIG_IDE_TASKFILE_IO
-#  undef __TASKFILE__IO /* define __TASKFILE__IO */
-#else /* CONFIG_IDE_TASKFILE_IO */
-#  undef __TASKFILE__IO
-#endif /* CONFIG_IDE_TASKFILE_IO */
-
-#ifndef __TASKFILE__IO
-
-static void idedisk_bswap_data (void *buffer, int wcount)
-{
-       u16 *p = buffer;
-
-       while (wcount--) {
-               *p = *p << 8 | *p >> 8; p++;
-               *p = *p << 8 | *p >> 8; p++;
-       }
-}
-
-static inline void idedisk_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
-{
-       ide_input_data(drive, buffer, wcount);
-       if (drive->bswap)
-               idedisk_bswap_data(buffer, wcount);
-}
-
-static inline void idedisk_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
-{
-       if (drive->bswap) {
-               idedisk_bswap_data(buffer, wcount);
-               ide_output_data(drive, buffer, wcount);
-               idedisk_bswap_data(buffer, wcount);
-       } else
-               ide_output_data(drive, buffer, wcount);
-}
-
-#endif /* __TASKFILE__IO */
-
-/*
- * lba_capacity_is_ok() performs a sanity check on the claimed "lba_capacity"
- * value for this drive (from its reported identification information).
- *
- * Returns:    1 if lba_capacity looks sensible
- *             0 otherwise
- *
- * It is called only once for each drive.
- */
-static int lba_capacity_is_ok (struct hd_driveid *id)
-{
-       unsigned long lba_sects, chs_sects, head, tail;
-
-       if ((id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400)) {
-               printk("48-bit Drive: %llu \n", id->lba_capacity_2);
-               return 1;
-       }
-
-       /*
-        * The ATA spec tells large drives to return
-        * C/H/S = 16383/16/63 independent of their size.
-        * Some drives can be jumpered to use 15 heads instead of 16.
-        * Some drives can be jumpered to use 4092 cyls instead of 16383.
-        */
-       if ((id->cyls == 16383
-            || (id->cyls == 4092 && id->cur_cyls == 16383)) &&
-           id->sectors == 63 &&
-           (id->heads == 15 || id->heads == 16) &&
-           id->lba_capacity >= 16383*63*id->heads)
-               return 1;
-
-       lba_sects   = id->lba_capacity;
-       chs_sects   = id->cyls * id->heads * id->sectors;
-
-       /* perform a rough sanity check on lba_sects:  within 10% is OK */
-       if ((lba_sects - chs_sects) < chs_sects/10)
-               return 1;
-
-       /* some drives have the word order reversed */
-       head = ((lba_sects >> 16) & 0xffff);
-       tail = (lba_sects & 0xffff);
-       lba_sects = (head | (tail << 16));
-       if ((lba_sects - chs_sects) < chs_sects/10) {
-               id->lba_capacity = lba_sects;
-               return 1;       /* lba_capacity is (now) good */
-       }
-
-       return 0;       /* lba_capacity value may be bad */
-}
-
-#ifndef __TASKFILE__IO
-
-/*
- * read_intr() is the handler for disk read/multread interrupts
- */
-static ide_startstop_t read_intr (ide_drive_t *drive)
-{
-       byte stat;
-       int i;
-       unsigned int msect, nsect;
-       struct request *rq;
-
-       /* new way for dealing with premature shared PCI interrupts */
-       if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
-               if (stat & (ERR_STAT|DRQ_STAT)) {
-                       return ide_error(drive, "read_intr", stat);
-               }
-               /* no data yet, so wait for another interrupt */
-               ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
-               return ide_started;
-       }
-       msect = drive->mult_count;
-       
-read_next:
-       rq = HWGROUP(drive)->rq;
-       if (msect) {
-               if ((nsect = rq->current_nr_sectors) > msect)
-                       nsect = msect;
-               msect -= nsect;
-       } else
-               nsect = 1;
-       idedisk_input_data(drive, rq->buffer, nsect * SECTOR_WORDS);
-#ifdef DEBUG
-       printk("%s:  read: sectors(%ld-%ld), buffer=0x%08lx, remaining=%ld\n",
-               drive->name, rq->sector, rq->sector+nsect-1,
-               (unsigned long) rq->buffer+(nsect<<9), rq->nr_sectors-nsect);
-#endif
-       rq->sector += nsect;
-       rq->buffer += nsect<<9;
-       rq->errors = 0;
-       i = (rq->nr_sectors -= nsect);
-       if (((long)(rq->current_nr_sectors -= nsect)) <= 0)
-               ide_end_request(1, HWGROUP(drive));
-       if (i > 0) {
-               if (msect)
-                       goto read_next;
-               ide_set_handler (drive, &read_intr, WAIT_CMD, NULL);
-                return ide_started;
-       }
-        return ide_stopped;
-}
-
-/*
- * write_intr() is the handler for disk write interrupts
- */
-static ide_startstop_t write_intr (ide_drive_t *drive)
-{
-       byte stat;
-       int i;
-       ide_hwgroup_t *hwgroup = HWGROUP(drive);
-       struct request *rq = hwgroup->rq;
-
-       if (!OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
-               printk("%s: write_intr error1: nr_sectors=%ld, stat=0x%02x\n", drive->name, rq->nr_sectors, stat);
-        } else {
-#ifdef DEBUG
-               printk("%s: write: sector %ld, buffer=0x%08lx, remaining=%ld\n",
-                       drive->name, rq->sector, (unsigned long) rq->buffer,
-                       rq->nr_sectors-1);
-#endif
-               if ((rq->nr_sectors == 1) ^ ((stat & DRQ_STAT) != 0)) {
-                       rq->sector++;
-                       rq->buffer += 512;
-                       rq->errors = 0;
-                       i = --rq->nr_sectors;
-                       --rq->current_nr_sectors;
-                       if (((long)rq->current_nr_sectors) <= 0)
-                               ide_end_request(1, hwgroup);
-                       if (i > 0) {
-                               idedisk_output_data (drive, rq->buffer, SECTOR_WORDS);
-                               ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
-                                return ide_started;
-                       }
-                        return ide_stopped;
-               }
-               return ide_stopped;     /* the original code did this here (?) */
-       }
-       return ide_error(drive, "write_intr", stat);
-}
-
-/*
- * ide_multwrite() transfers a block of up to mcount sectors of data
- * to a drive as part of a disk multiple-sector write operation.
- *
- * Returns 0 on success.
- *
- * Note that we may be called from two contexts - the do_rw_disk context
- * and IRQ context. The IRQ can happen any time after we've output the
- * full "mcount" number of sectors, so we must make sure we update the
- * state _before_ we output the final part of the data!
- */
-int ide_multwrite (ide_drive_t *drive, unsigned int mcount)
-{
-       ide_hwgroup_t   *hwgroup= HWGROUP(drive);
-       struct request  *rq = &hwgroup->wrq;
-       do {
-               char *buffer;
-               int nsect = rq->current_nr_sectors;
-               if (nsect > mcount)
-                       nsect = mcount;
-               mcount -= nsect;
-               buffer = rq->buffer;
-
-               rq->sector += nsect;
-               rq->buffer += nsect << 9;
-               rq->nr_sectors -= nsect;
-               rq->current_nr_sectors -= nsect;
-
-               /* Do we move to the next bh after this? */
-               if (!rq->current_nr_sectors) {
-                       struct buffer_head *bh = rq->bh->b_reqnext;
-
-                       /* end early early we ran out of requests */
-                       if (!bh) {
-                               mcount = 0;
-                       } else {
-                               rq->bh = bh;
-                               rq->current_nr_sectors = bh->b_size >> 9;
-                               rq->buffer             = bh->b_data;
-                       }
-               }
-
-               /*
-                * Ok, we're all setup for the interrupt
-                * re-entering us on the last transfer.
-                */
-               idedisk_output_data(drive, buffer, nsect<<7);
-       } while (mcount);
-
-        return 0;
-}
-
-/*
- * multwrite_intr() is the handler for disk multwrite interrupts
- */
-static ide_startstop_t multwrite_intr (ide_drive_t *drive)
-{
-       byte stat;
-       int i;
-       ide_hwgroup_t *hwgroup = HWGROUP(drive);
-       struct request *rq = &hwgroup->wrq;
-
-       if (OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
-               if (stat & DRQ_STAT) {
-                       /*
-                        *      The drive wants data. Remember rq is the copy
-                        *      of the request
-                        */
-                       if (rq->nr_sectors) {
-                               if (ide_multwrite(drive, drive->mult_count))
-                                       return ide_stopped;
-                               ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
-                               return ide_started;
-                       }
-               } else {
-                       /*
-                        *      If the copy has all the blocks completed then
-                        *      we can end the original request.
-                        */
-                       if (!rq->nr_sectors) {  /* all done? */
-                               rq = hwgroup->rq;
-                               for (i = rq->nr_sectors; i > 0;){
-                                       i -= rq->current_nr_sectors;
-                                       ide_end_request(1, hwgroup);
-                               }
-                               return ide_stopped;
-                       }
-               }
-               return ide_stopped;     /* the original code did this here (?) */
-       }
-       return ide_error(drive, "multwrite_intr", stat);
-}
-#endif /* __TASKFILE__IO */
-
-#ifdef __TASKFILE__IO
-
-static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);
-static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);
-static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long long block);
-
-/*
- * do_rw_disk() issues READ and WRITE commands to a disk,
- * using LBA if supported, or CHS otherwise, to address sectors.
- * It also takes care of issuing special DRIVE_CMDs.
- */
-static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
-{
-       if (rq->cmd == READ)
-               goto good_command;
-       if (rq->cmd == WRITE)
-               goto good_command;
-
-       printk(KERN_ERR "%s: bad command: %d\n", drive->name, rq->cmd);
-       ide_end_request(0, HWGROUP(drive));
-       return ide_stopped;
-
-good_command:
-
-#ifdef CONFIG_BLK_DEV_PDC4030
-       if (IS_PDC4030_DRIVE) {
-               extern ide_startstop_t promise_rw_disk(ide_drive_t *, struct request *, unsigned long);
-               return promise_rw_disk(drive, rq, block);
-       }
-#endif /* CONFIG_BLK_DEV_PDC4030 */
-
-       if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing))  /* 48-bit LBA */
-               return lba_48_rw_disk(drive, rq, (unsigned long long) block);
-       if (drive->select.b.lba)                /* 28-bit LBA */
-               return lba_28_rw_disk(drive, rq, (unsigned long) block);
-
-       /* 28-bit CHS : DIE DIE DIE piece of legacy crap!!! */
-       return chs_rw_disk(drive, rq, (unsigned long) block);
-}
-
-static task_ioreg_t get_command (ide_drive_t *drive, int cmd)
-{
-       int lba48bit = (drive->id->cfs_enable_2 & 0x0400) ? 1 : 0;
-
-#if 1
-       lba48bit = drive->addressing;
-#endif
-
-       if ((cmd == READ) && (drive->using_dma))
-               return (lba48bit) ? WIN_READDMA_EXT : WIN_READDMA;
-       else if ((cmd == READ) && (drive->mult_count))
-               return (lba48bit) ? WIN_MULTREAD_EXT : WIN_MULTREAD;
-       else if (cmd == READ)
-               return (lba48bit) ? WIN_READ_EXT : WIN_READ;
-       else if ((cmd == WRITE) && (drive->using_dma))
-               return (lba48bit) ? WIN_WRITEDMA_EXT : WIN_WRITEDMA;
-       else if ((cmd == WRITE) && (drive->mult_count))
-               return (lba48bit) ? WIN_MULTWRITE_EXT : WIN_MULTWRITE;
-       else if (cmd == WRITE)
-               return (lba48bit) ? WIN_WRITE_EXT : WIN_WRITE;
-       else
-               return WIN_NOP;
-}
-
-static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
-{
-       struct hd_drive_task_hdr        taskfile;
-       struct hd_drive_hob_hdr         hobfile;
-       ide_task_t                      args;
-
-       task_ioreg_t command    = get_command(drive, rq->cmd);
-       unsigned int track      = (block / drive->sect);
-       unsigned int sect       = (block % drive->sect) + 1;
-       unsigned int head       = (track % drive->head);
-       unsigned int cyl        = (track / drive->head);
-
-       memset(&taskfile, 0, sizeof(task_struct_t));
-       memset(&hobfile, 0, sizeof(hob_struct_t));
-
-       taskfile.sector_count   = (rq->nr_sectors==256)?0x00:rq->nr_sectors;
-       taskfile.sector_number  = sect;
-       taskfile.low_cylinder   = cyl;
-       taskfile.high_cylinder  = (cyl>>8);
-       taskfile.device_head    = head;
-       taskfile.device_head    |= drive->select.all;
-       taskfile.command        = command;
-
-#ifdef DEBUG
-       printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
-       if (lba)        printk("LBAsect=%lld, ", block);
-       else            printk("CHS=%d/%d/%d, ", cyl, head, sect);
-       printk("sectors=%ld, ", rq->nr_sectors);
-       printk("buffer=0x%08lx\n", (unsigned long) rq->buffer);
-#endif
-
-       memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
-       memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
-       args.command_type       = ide_cmd_type_parser(&args);
-       args.prehandler         = ide_pre_handler_parser(&taskfile, &hobfile);
-       args.handler            = ide_handler_parser(&taskfile, &hobfile);
-       args.posthandler        = NULL;
-       args.rq                 = (struct request *) rq;
-       args.block              = block;
-       rq->special             = NULL;
-       rq->special             = (ide_task_t *)&args;
-
-       return do_rw_taskfile(drive, &args);
-}
-
-static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
-{
-       struct hd_drive_task_hdr        taskfile;
-       struct hd_drive_hob_hdr         hobfile;
-       ide_task_t                      args;
-
-       task_ioreg_t command    = get_command(drive, rq->cmd);
-
-       memset(&taskfile, 0, sizeof(task_struct_t));
-       memset(&hobfile, 0, sizeof(hob_struct_t));
-
-       taskfile.sector_count   = (rq->nr_sectors==256)?0x00:rq->nr_sectors;
-       taskfile.sector_number  = block;
-       taskfile.low_cylinder   = (block>>=8);
-       taskfile.high_cylinder  = (block>>=8);
-       taskfile.device_head    = ((block>>8)&0x0f);
-       taskfile.device_head    |= drive->select.all;
-       taskfile.command        = command;
-
-
-#ifdef DEBUG
-       printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
-       if (lba)        printk("LBAsect=%lld, ", block);
-       else            printk("CHS=%d/%d/%d, ", cyl, head, sect);
-       printk("sectors=%ld, ", rq->nr_sectors);
-       printk("buffer=0x%08lx\n", (unsigned long) rq->buffer);
-#endif
-
-       memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
-       memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
-       args.command_type       = ide_cmd_type_parser(&args);
-       args.prehandler         = ide_pre_handler_parser(&taskfile, &hobfile);
-       args.handler            = ide_handler_parser(&taskfile, &hobfile);
-       args.posthandler        = NULL;
-       args.rq                 = (struct request *) rq;
-       args.block              = block;
-       rq->special             = NULL;
-       rq->special             = (ide_task_t *)&args;
-
-       return do_rw_taskfile(drive, &args);
-}
-
-/*
- * 268435455  == 137439 MB or 28bit limit
- * 320173056  == 163929 MB or 48bit addressing
- * 1073741822 == 549756 MB or 48bit addressing fake drive
- */
-
-static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long long block)
-{
-       struct hd_drive_task_hdr        taskfile;
-       struct hd_drive_hob_hdr         hobfile;
-       ide_task_t                      args;
-
-       task_ioreg_t command    = get_command(drive, rq->cmd);
-
-       memset(&taskfile, 0, sizeof(task_struct_t));
-       memset(&hobfile, 0, sizeof(hob_struct_t));
-
-       taskfile.sector_count   = rq->nr_sectors;
-       hobfile.sector_count    = (rq->nr_sectors>>8);
-
-       if (rq->nr_sectors == 65536) {
-               taskfile.sector_count   = 0x00;
-               hobfile.sector_count    = 0x00;
-       }
-
-       taskfile.sector_number  = block;        /* low lba */
-       taskfile.low_cylinder   = (block>>=8);  /* mid lba */
-       taskfile.high_cylinder  = (block>>=8);  /* hi  lba */
-       hobfile.sector_number   = (block>>=8);  /* low lba */
-       hobfile.low_cylinder    = (block>>=8);  /* mid lba */
-       hobfile.high_cylinder   = (block>>=8);  /* hi  lba */
-       taskfile.device_head    = drive->select.all;
-       hobfile.device_head     = taskfile.device_head;
-       hobfile.control         = (drive->ctl|0x80);
-       taskfile.command        = command;
-
-#ifdef DEBUG
-       printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
-       if (lba)        printk("LBAsect=%lld, ", block);
-       else            printk("CHS=%d/%d/%d, ", cyl, head, sect);
-       printk("sectors=%ld, ", rq->nr_sectors);
-       printk("buffer=0x%08lx\n", (unsigned long) rq->buffer);
-#endif
-
-       memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
-       memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
-       args.command_type       = ide_cmd_type_parser(&args);
-       args.prehandler         = ide_pre_handler_parser(&taskfile, &hobfile);
-       args.handler            = ide_handler_parser(&taskfile, &hobfile);
-       args.posthandler        = NULL;
-       args.rq                 = (struct request *) rq;
-       args.block              = block;
-       rq->special             = NULL;
-       rq->special             = (ide_task_t *)&args;
-
-       return do_rw_taskfile(drive, &args);
-}
-
-#else /* !__TASKFILE__IO */
-/*
- * do_rw_disk() issues READ and WRITE commands to a disk,
- * using LBA if supported, or CHS otherwise, to address sectors.
- * It also takes care of issuing special DRIVE_CMDs.
- */
-static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
-{
-       if (IDE_CONTROL_REG)
-               OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
-
-#ifdef CONFIG_BLK_DEV_PDC4030
-       if (drive->select.b.lba || IS_PDC4030_DRIVE) {
-#else /* !CONFIG_BLK_DEV_PDC4030 */
-       if (drive->select.b.lba) {
-#endif /* CONFIG_BLK_DEV_PDC4030 */
-
-               if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
-                       task_ioreg_t tasklets[10];
-
-                       tasklets[0] = 0;
-                       tasklets[1] = 0;
-                       tasklets[2] = rq->nr_sectors;
-                       tasklets[3] = (rq->nr_sectors>>8);
-                       if (rq->nr_sectors == 65536) {
-                               tasklets[2] = 0x00;
-                               tasklets[3] = 0x00;
-                       }
-                       tasklets[4] = (task_ioreg_t) block;
-                       tasklets[5] = (task_ioreg_t) (block>>8);
-                       tasklets[6] = (task_ioreg_t) (block>>16);
-                       tasklets[7] = (task_ioreg_t) (block>>24);
-                       tasklets[8] = (task_ioreg_t) 0;
-                       tasklets[9] = (task_ioreg_t) 0;
-//                     tasklets[8] = (task_ioreg_t) (block>>32);
-//                     tasklets[9] = (task_ioreg_t) (block>>40);
-#ifdef DEBUG
-                       printk("%s: %sing: LBAsect=%lu, sectors=%ld, buffer=0x%08lx, LBAsect=0x%012lx\n",
-                               drive->name,
-                               (rq->cmd==READ)?"read":"writ",
-                               block,
-                               rq->nr_sectors,
-                               (unsigned long) rq->buffer,
-                               block);
-                       printk("%s: 0x%02x%02x 0x%02x%02x%02x%02x%02x%02x\n",
-                               drive->name, tasklets[3], tasklets[2],
-                               tasklets[9], tasklets[8], tasklets[7],
-                               tasklets[6], tasklets[5], tasklets[4]);
-#endif
-                       OUT_BYTE(tasklets[1], IDE_FEATURE_REG);
-                       OUT_BYTE(tasklets[3], IDE_NSECTOR_REG);
-                       OUT_BYTE(tasklets[7], IDE_SECTOR_REG);
-                       OUT_BYTE(tasklets[8], IDE_LCYL_REG);
-                       OUT_BYTE(tasklets[9], IDE_HCYL_REG);
-
-                       OUT_BYTE(tasklets[0], IDE_FEATURE_REG);
-                       OUT_BYTE(tasklets[2], IDE_NSECTOR_REG);
-                       OUT_BYTE(tasklets[4], IDE_SECTOR_REG);
-                       OUT_BYTE(tasklets[5], IDE_LCYL_REG);
-                       OUT_BYTE(tasklets[6], IDE_HCYL_REG);
-                       OUT_BYTE(0x00|drive->select.all,IDE_SELECT_REG);
-               } else {
-#ifdef DEBUG
-                       printk("%s: %sing: LBAsect=%ld, sectors=%ld, buffer=0x%08lx\n",
-                               drive->name, (rq->cmd==READ)?"read":"writ",
-                               block, rq->nr_sectors, (unsigned long) rq->buffer);
-#endif
-                       OUT_BYTE(0x00, IDE_FEATURE_REG);
-                       OUT_BYTE((rq->nr_sectors==256)?0x00:rq->nr_sectors,IDE_NSECTOR_REG);
-                       OUT_BYTE(block,IDE_SECTOR_REG);
-                       OUT_BYTE(block>>=8,IDE_LCYL_REG);
-                       OUT_BYTE(block>>=8,IDE_HCYL_REG);
-                       OUT_BYTE(((block>>8)&0x0f)|drive->select.all,IDE_SELECT_REG);
-               }
-       } else {
-               unsigned int sect,head,cyl,track;
-               track = block / drive->sect;
-               sect  = block % drive->sect + 1;
-               OUT_BYTE(sect,IDE_SECTOR_REG);
-               head  = track % drive->head;
-               cyl   = track / drive->head;
-
-               OUT_BYTE(0x00, IDE_FEATURE_REG);
-               OUT_BYTE((rq->nr_sectors==256)?0x00:rq->nr_sectors,IDE_NSECTOR_REG);
-               OUT_BYTE(cyl,IDE_LCYL_REG);
-               OUT_BYTE(cyl>>8,IDE_HCYL_REG);
-               OUT_BYTE(head|drive->select.all,IDE_SELECT_REG);
-#ifdef DEBUG
-               printk("%s: %sing: CHS=%d/%d/%d, sectors=%ld, buffer=0x%08lx\n",
-                       drive->name, (rq->cmd==READ)?"read":"writ", cyl,
-                       head, sect, rq->nr_sectors, (unsigned long) rq->buffer);
-#endif
-       }
-#ifdef CONFIG_BLK_DEV_PDC4030
-       if (IS_PDC4030_DRIVE) {
-               extern ide_startstop_t do_pdc4030_io(ide_drive_t *, struct request *);
-               return do_pdc4030_io (drive, rq);
-       }
-#endif /* CONFIG_BLK_DEV_PDC4030 */
-       if (rq->cmd == READ) {
-#ifdef CONFIG_BLK_DEV_IDEDMA
-               if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive)))
-                       return ide_started;
-#endif /* CONFIG_BLK_DEV_IDEDMA */
-               ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
-               if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
-                       OUT_BYTE(drive->mult_count ? WIN_MULTREAD_EXT : WIN_READ_EXT, IDE_COMMAND_REG);
-               } else {
-                       OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, IDE_COMMAND_REG);
-               }
-               return ide_started;
-       }
-       if (rq->cmd == WRITE) {
-               ide_startstop_t startstop;
-#ifdef CONFIG_BLK_DEV_IDEDMA
-               if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_write, drive)))
-                       return ide_started;
-#endif /* CONFIG_BLK_DEV_IDEDMA */
-               if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
-                       OUT_BYTE(drive->mult_count ? WIN_MULTWRITE_EXT : WIN_WRITE_EXT, IDE_COMMAND_REG);
-               } else {
-                       OUT_BYTE(drive->mult_count ? WIN_MULTWRITE : WIN_WRITE, IDE_COMMAND_REG);
-               }
-               if (ide_wait_stat(&startstop, drive, DATA_READY, drive->bad_wstat, WAIT_DRQ)) {
-                       printk(KERN_ERR "%s: no DRQ after issuing %s\n", drive->name,
-                               drive->mult_count ? "MULTWRITE" : "WRITE");
-                       return startstop;
-               }
-               if (!drive->unmask)
-                       __cli();        /* local CPU only */
-               if (drive->mult_count) {
-                       ide_hwgroup_t *hwgroup = HWGROUP(drive);
-       /*
-        * Ugh.. this part looks ugly because we MUST set up
-        * the interrupt handler before outputting the first block
-        * of data to be written.  If we hit an error (corrupted buffer list)
-        * in ide_multwrite(), then we need to remove the handler/timer
-        * before returning.  Fortunately, this NEVER happens (right?).
-        *
-        * Except when you get an error it seems...
-        */
-                       hwgroup->wrq = *rq; /* scratchpad */
-                       ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL);
-                       if (ide_multwrite(drive, drive->mult_count)) {
-                               unsigned long flags;
-                               spin_lock_irqsave(&io_request_lock, flags);
-                               hwgroup->handler = NULL;
-                               del_timer(&hwgroup->timer);
-                               spin_unlock_irqrestore(&io_request_lock, flags);
-                               return ide_stopped;
-                       }
-               } else {
-                       ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
-                       idedisk_output_data(drive, rq->buffer, SECTOR_WORDS);
-               }
-               return ide_started;
-       }
-       printk(KERN_ERR "%s: bad command: %d\n", drive->name, rq->cmd);
-       ide_end_request(0, HWGROUP(drive));
-       return ide_stopped;
-}
-
-#endif /* __TASKFILE__IO */
-
-static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *drive)
-{
-       MOD_INC_USE_COUNT;
-       if (drive->removable && drive->usage == 1) {
-               struct hd_drive_task_hdr taskfile;
-               struct hd_drive_hob_hdr hobfile;
-               memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-               memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-               taskfile.command = WIN_DOORLOCK;
-               check_disk_change(inode->i_rdev);
-               /*
-                * Ignore the return code from door_lock,
-                * since the open() has already succeeded,
-                * and the door_lock is irrelevant at this point.
-                */
-               if (drive->doorlocking && ide_wait_taskfile(drive, &taskfile, &hobfile, NULL))
-                       drive->doorlocking = 0;
-       }
-       return 0;
-}
-
-static int do_idedisk_flushcache(ide_drive_t *drive);
-
-static void idedisk_release (struct inode *inode, struct file *filp, ide_drive_t *drive)
-{
-       if (drive->removable && !drive->usage) {
-               struct hd_drive_task_hdr taskfile;
-               struct hd_drive_hob_hdr hobfile;
-               memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-               memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-               taskfile.command = WIN_DOORUNLOCK;
-               invalidate_bdev(inode->i_bdev, 0);
-               if (drive->doorlocking && ide_wait_taskfile(drive, &taskfile, &hobfile, NULL))
-                       drive->doorlocking = 0;
-       }
-       if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
-               if (do_idedisk_flushcache(drive))
-                       printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n",
-                               drive->name);
-       MOD_DEC_USE_COUNT;
-}
-
-static int idedisk_media_change (ide_drive_t *drive)
-{
-       return drive->removable;        /* if removable, always assume it was changed */
-}
-
-static void idedisk_revalidate (ide_drive_t *drive)
-{
-       grok_partitions(HWIF(drive)->gd, drive->select.b.unit,
-                       1<<PARTN_BITS,
-                       current_capacity(drive));
-}
-
-/*
- * Queries for true maximum capacity of the drive.
- * Returns maximum LBA address (> 0) of the drive, 0 if failed.
- */
-static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
-{
-       ide_task_t args;
-       unsigned long addr = 0;
-
-       if (!(drive->id->command_set_1 & 0x0400) &&
-           !(drive->id->cfs_enable_2 & 0x0100))
-               return addr;
-
-       /* Create IDE/ATA command request structure */
-       memset(&args, 0, sizeof(ide_task_t));
-       args.tfRegister[IDE_SELECT_OFFSET]      = 0x40;
-       args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_READ_NATIVE_MAX;
-       args.handler                            = task_no_data_intr;
-
-       /* submit command request */
-       ide_raw_taskfile(drive, &args, NULL);
-
-       /* if OK, compute maximum address value */
-       if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
-               addr = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24)
-                    | ((args.tfRegister[  IDE_HCYL_OFFSET]       ) << 16)
-                    | ((args.tfRegister[  IDE_LCYL_OFFSET]       ) <<  8)
-                    | ((args.tfRegister[IDE_SECTOR_OFFSET]       ));
-       }
-       addr++; /* since the return value is (maxlba - 1), we add 1 */
-       return addr;
-}
-
-static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive)
-{
-       ide_task_t args;
-       unsigned long long addr = 0;
-
-       /* Create IDE/ATA command request structure */
-       memset(&args, 0, sizeof(ide_task_t));
-
-       args.tfRegister[IDE_SELECT_OFFSET]      = 0x40;
-       args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_READ_NATIVE_MAX_EXT;
-       args.handler                            = task_no_data_intr;
-
-        /* submit command request */
-        ide_raw_taskfile(drive, &args, NULL);
-
-       /* if OK, compute maximum address value */
-       if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
-               u32 high = ((args.hobRegister[IDE_HCYL_OFFSET_HOB])<<16) |
-                          ((args.hobRegister[IDE_LCYL_OFFSET_HOB])<<8) |
-                           (args.hobRegister[IDE_SECTOR_OFFSET_HOB]); 
-               u32 low  = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) |
-                          ((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
-                           (args.tfRegister[IDE_SECTOR_OFFSET]);
-               addr = ((__u64)high << 24) | low;
-       }
-       addr++; /* since the return value is (maxlba - 1), we add 1 */
-       return addr;
-}
-
-#ifdef CONFIG_IDEDISK_STROKE
-/*
- * Sets maximum virtual LBA address of the drive.
- * Returns new maximum virtual LBA address (> 0) or 0 on failure.
- */
-static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long addr_req)
-{
-       ide_task_t args;
-       unsigned long addr_set = 0;
-       
-       addr_req--;
-       /* Create IDE/ATA command request structure */
-       memset(&args, 0, sizeof(ide_task_t));
-       args.tfRegister[IDE_SECTOR_OFFSET]      = ((addr_req >>  0) & 0xff);
-       args.tfRegister[IDE_LCYL_OFFSET]        = ((addr_req >>  8) & 0xff);
-       args.tfRegister[IDE_HCYL_OFFSET]        = ((addr_req >> 16) & 0xff);
-       args.tfRegister[IDE_SELECT_OFFSET]      = ((addr_req >> 24) & 0x0f) | 0x40;
-       args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_SET_MAX;
-       args.handler                            = task_no_data_intr;
-       /* submit command request */
-       ide_raw_taskfile(drive, &args, NULL);
-       /* if OK, read new maximum address value */
-       if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
-               addr_set = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24)
-                        | ((args.tfRegister[  IDE_HCYL_OFFSET]       ) << 16)
-                        | ((args.tfRegister[  IDE_LCYL_OFFSET]       ) <<  8)
-                        | ((args.tfRegister[IDE_SECTOR_OFFSET]       ));
-       }
-       addr_set++;
-       return addr_set;
-}
-
-static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsigned long long addr_req)
-{
-       ide_task_t args;
-       unsigned long long addr_set = 0;
-
-       addr_req--;
-       /* Create IDE/ATA command request structure */
-       memset(&args, 0, sizeof(ide_task_t));
-       args.tfRegister[IDE_SECTOR_OFFSET]      = ((addr_req >>  0) & 0xff);
-       args.tfRegister[IDE_LCYL_OFFSET]        = ((addr_req >>= 8) & 0xff);
-       args.tfRegister[IDE_HCYL_OFFSET]        = ((addr_req >>= 8) & 0xff);
-       args.tfRegister[IDE_SELECT_OFFSET]      = 0x40;
-       args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_SET_MAX_EXT;
-       args.hobRegister[IDE_SECTOR_OFFSET_HOB] = ((addr_req >>= 8) & 0xff);
-       args.hobRegister[IDE_LCYL_OFFSET_HOB]   = ((addr_req >>= 8) & 0xff);
-       args.hobRegister[IDE_HCYL_OFFSET_HOB]   = ((addr_req >>= 8) & 0xff);
-       args.hobRegister[IDE_SELECT_OFFSET_HOB] = 0x40;
-       args.hobRegister[IDE_CONTROL_OFFSET_HOB]= (drive->ctl|0x80);
-        args.handler                           = task_no_data_intr;
-       /* submit command request */
-       ide_raw_taskfile(drive, &args, NULL);
-       /* if OK, compute maximum address value */
-       if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
-               u32 high = ((args.hobRegister[IDE_HCYL_OFFSET_HOB])<<16) |
-                          ((args.hobRegister[IDE_LCYL_OFFSET_HOB])<<8) |
-                           (args.hobRegister[IDE_SECTOR_OFFSET_HOB]);
-               u32 low  = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) |
-                          ((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
-                           (args.tfRegister[IDE_SECTOR_OFFSET]);
-               addr_set = ((__u64)high << 24) | low;
-       }
-       return addr_set;
-}
-
-/*
- * Tests if the drive supports Host Protected Area feature.
- * Returns true if supported, false otherwise.
- */
-static inline int idedisk_supports_host_protected_area(ide_drive_t *drive)
-{
-       int flag = (drive->id->cfs_enable_1 & 0x0400) ? 1 : 0;
-       printk("%s: host protected area => %d\n", drive->name, flag);
-       return flag;
-}
-
-#endif /* CONFIG_IDEDISK_STROKE */
-
-/*
- * Compute drive->capacity, the full capacity of the drive
- * Called with drive->id != NULL.
- *
- * To compute capacity, this uses either of
- *
- *    1. CHS value set by user       (whatever user sets will be trusted)
- *    2. LBA value from target drive (require new ATA feature)
- *    3. LBA value from system BIOS  (new one is OK, old one may break)
- *    4. CHS value from system BIOS  (traditional style)
- *
- * in above order (i.e., if value of higher priority is available,
- * reset will be ignored).
- */
-static void init_idedisk_capacity (ide_drive_t  *drive)
-{
-       struct hd_driveid *id = drive->id;
-       unsigned long capacity = drive->cyl * drive->head * drive->sect;
-       unsigned long set_max = idedisk_read_native_max_address(drive);
-       unsigned long long capacity_2 = capacity;
-       unsigned long long set_max_ext;
-
-       drive->capacity48 = 0;
-       drive->select.b.lba = 0;
-
-       if (id->cfs_enable_2 & 0x0400) {
-               capacity_2 = id->lba_capacity_2;
-               drive->head             = drive->bios_head = 255;
-               drive->sect             = drive->bios_sect = 63;
-               drive->cyl = (unsigned int) capacity_2 / (drive->head * drive->sect);
-               drive->select.b.lba     = 1;
-               set_max_ext = idedisk_read_native_max_address_ext(drive);
-               if (set_max_ext > capacity_2) {
-#ifdef CONFIG_IDEDISK_STROKE
-                       set_max_ext = idedisk_read_native_max_address_ext(drive);
-                       set_max_ext = idedisk_set_max_address_ext(drive, set_max_ext);
-                       if (set_max_ext) {
-                               drive->capacity48 = capacity_2 = set_max_ext;
-                               drive->cyl = (unsigned int) set_max_ext / (drive->head * drive->sect);
-                               drive->select.b.lba = 1;
-                               drive->id->lba_capacity_2 = capacity_2;
-                        }
-#else /* !CONFIG_IDEDISK_STROKE */
-                       printk("%s: setmax_ext LBA %llu, native  %llu\n",
-                               drive->name, set_max_ext, capacity_2);
-#endif /* CONFIG_IDEDISK_STROKE */
-               }
-               drive->bios_cyl         = drive->cyl;
-               drive->capacity48       = capacity_2;
-               drive->capacity         = (unsigned long) capacity_2;
-               return;
-       /* Determine capacity, and use LBA if the drive properly supports it */
-       } else if ((id->capability & 2) && lba_capacity_is_ok(id)) {
-               capacity = id->lba_capacity;
-               drive->cyl = capacity / (drive->head * drive->sect);
-               drive->select.b.lba = 1;
-       }
-
-       if (set_max > capacity) {
-#ifdef CONFIG_IDEDISK_STROKE
-               set_max = idedisk_read_native_max_address(drive);
-               set_max = idedisk_set_max_address(drive, set_max);
-               if (set_max) {
-                       drive->capacity = capacity = set_max;
-                       drive->cyl = set_max / (drive->head * drive->sect);
-                       drive->select.b.lba = 1;
-                       drive->id->lba_capacity = capacity;
-               }
-#else /* !CONFIG_IDEDISK_STROKE */
-               printk("%s: setmax LBA %lu, native  %lu\n",
-                       drive->name, set_max, capacity);
-#endif /* CONFIG_IDEDISK_STROKE */
-       }
-
-       drive->capacity = capacity;
-
-       if ((id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400)) {
-                drive->capacity48 = id->lba_capacity_2;
-               drive->head = 255;
-               drive->sect = 63;
-               drive->cyl = (unsigned long)(drive->capacity48) / (drive->head * drive->sect);
-       }
-}
-
-static unsigned long idedisk_capacity (ide_drive_t *drive)
-{
-       if (drive->id->cfs_enable_2 & 0x0400)
-               return (drive->capacity48 - drive->sect0);
-       return (drive->capacity - drive->sect0);
-}
-
-static ide_startstop_t idedisk_special (ide_drive_t *drive)
-{
-       special_t *s = &drive->special;
-
-       if (s->b.set_geometry) {
-               struct hd_drive_task_hdr taskfile;
-               struct hd_drive_hob_hdr hobfile;
-               ide_handler_t *handler = NULL;
-
-               memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-               memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-
-               s->b.set_geometry       = 0;
-               taskfile.sector_number  = drive->sect;
-               taskfile.low_cylinder   = drive->cyl;
-               taskfile.high_cylinder  = drive->cyl>>8;
-               taskfile.device_head    = ((drive->head-1)|drive->select.all)&0xBF;
-               if (!IS_PDC4030_DRIVE) {
-                       taskfile.sector_count   = drive->sect;
-                       taskfile.command        = WIN_SPECIFY;
-                       handler                 = ide_handler_parser(&taskfile, &hobfile);
-               }
-               do_taskfile(drive, &taskfile, &hobfile, handler);
-       } else if (s->b.recalibrate) {
-               s->b.recalibrate = 0;
-               if (!IS_PDC4030_DRIVE) {
-                       struct hd_drive_task_hdr taskfile;
-                       struct hd_drive_hob_hdr hobfile;
-                       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-                       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-                       taskfile.sector_count   = drive->sect;
-                       taskfile.command        = WIN_RESTORE;
-                       do_taskfile(drive, &taskfile, &hobfile, ide_handler_parser(&taskfile, &hobfile));
-               }
-       } else if (s->b.set_multmode) {
-               s->b.set_multmode = 0;
-               if (drive->id && drive->mult_req > drive->id->max_multsect)
-                       drive->mult_req = drive->id->max_multsect;
-               if (!IS_PDC4030_DRIVE) {
-                       struct hd_drive_task_hdr taskfile;
-                       struct hd_drive_hob_hdr hobfile;
-                       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-                       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-                       taskfile.sector_count   = drive->mult_req;
-                       taskfile.command        = WIN_SETMULT;
-                       do_taskfile(drive, &taskfile, &hobfile, ide_handler_parser(&taskfile, &hobfile));
-               }
-       } else if (s->all) {
-               int special = s->all;
-               s->all = 0;
-               printk(KERN_ERR "%s: bad special flag: 0x%02x\n", drive->name, special);
-               return ide_stopped;
-       }
-       return IS_PDC4030_DRIVE ? ide_stopped : ide_started;
-}
-
-static void idedisk_pre_reset (ide_drive_t *drive)
-{
-       int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
-
-       drive->special.all = 0;
-       drive->special.b.set_geometry = legacy;
-       drive->special.b.recalibrate  = legacy;
-       if (OK_TO_RESET_CONTROLLER)
-               drive->mult_count = 0;
-       if (!drive->keep_settings && !drive->using_dma)
-               drive->mult_req = 0;
-       if (drive->mult_req != drive->mult_count)
-               drive->special.b.set_multmode = 1;
-}
-
-#ifdef CONFIG_PROC_FS
-
-static int smart_enable(ide_drive_t *drive)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.feature        = SMART_ENABLE;
-       taskfile.low_cylinder   = SMART_LCYL_PASS;
-       taskfile.high_cylinder  = SMART_HCYL_PASS;
-       taskfile.command        = WIN_SMART;
-       return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-}
-
-static int get_smart_values(ide_drive_t *drive, byte *buf)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.feature        = SMART_READ_VALUES;
-       taskfile.sector_count   = 0x01;
-       taskfile.low_cylinder   = SMART_LCYL_PASS;
-       taskfile.high_cylinder  = SMART_HCYL_PASS;
-       taskfile.command        = WIN_SMART;
-       (void) smart_enable(drive);
-       return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
-}
-
-static int get_smart_thresholds(ide_drive_t *drive, byte *buf)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.feature        = SMART_READ_THRESHOLDS;
-       taskfile.sector_count   = 0x01;
-       taskfile.low_cylinder   = SMART_LCYL_PASS;
-       taskfile.high_cylinder  = SMART_HCYL_PASS;
-       taskfile.command        = WIN_SMART;
-       (void) smart_enable(drive);
-       return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
-}
-
-static int proc_idedisk_read_cache
-       (char *page, char **start, off_t off, int count, int *eof, void *data)
-{
-       ide_drive_t     *drive = (ide_drive_t *) data;
-       char            *out = page;
-       int             len;
-
-       if (drive->id)
-               len = sprintf(out,"%i\n", drive->id->buf_size / 2);
-       else
-               len = sprintf(out,"(none)\n");
-       PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
-}
-
-static int proc_idedisk_read_smart_thresholds
-       (char *page, char **start, off_t off, int count, int *eof, void *data)
-{
-       ide_drive_t     *drive = (ide_drive_t *)data;
-       int             len = 0, i = 0;
-
-       if (!get_smart_thresholds(drive, page)) {
-               unsigned short *val = (unsigned short *) page;
-               char *out = ((char *)val) + (SECTOR_WORDS * 4);
-               page = out;
-               do {
-                       out += sprintf(out, "%04x%c", le16_to_cpu(*val), (++i & 7) ? ' ' : '\n');
-                       val += 1;
-               } while (i < (SECTOR_WORDS * 2));
-               len = out - page;
-       }
-       PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
-}
-
-static int proc_idedisk_read_smart_values
-       (char *page, char **start, off_t off, int count, int *eof, void *data)
-{
-       ide_drive_t     *drive = (ide_drive_t *)data;
-       int             len = 0, i = 0;
-
-       if (!get_smart_values(drive, page)) {
-               unsigned short *val = (unsigned short *) page;
-               char *out = ((char *)val) + (SECTOR_WORDS * 4);
-               page = out;
-               do {
-                       out += sprintf(out, "%04x%c", le16_to_cpu(*val), (++i & 7) ? ' ' : '\n');
-                       val += 1;
-               } while (i < (SECTOR_WORDS * 2));
-               len = out - page;
-       }
-       PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
-}
-
-static ide_proc_entry_t idedisk_proc[] = {
-       { "cache",              S_IFREG|S_IRUGO,        proc_idedisk_read_cache,                NULL },
-       { "geometry",           S_IFREG|S_IRUGO,        proc_ide_read_geometry,                 NULL },
-       { "smart_values",       S_IFREG|S_IRUSR,        proc_idedisk_read_smart_values,         NULL },
-       { "smart_thresholds",   S_IFREG|S_IRUSR,        proc_idedisk_read_smart_thresholds,     NULL },
-       { NULL, 0, NULL, NULL }
-};
-
-#else
-
-#define        idedisk_proc    NULL
-
-#endif /* CONFIG_PROC_FS */
-
-static int set_multcount(ide_drive_t *drive, int arg)
-{
-#ifdef __TASKFILE__IO
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-
-       if (drive->special.b.set_multmode)
-               return -EBUSY;
-
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.sector_count   = drive->mult_req;
-       taskfile.command        = WIN_SETMULT;
-       drive->mult_req         = arg;
-       drive->special.b.set_multmode = 1;
-       ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-#else /* !__TASKFILE__IO */
-       struct request rq;
-
-       if (drive->special.b.set_multmode)
-               return -EBUSY;
-       ide_init_drive_cmd (&rq);
-       rq.cmd = IDE_DRIVE_CMD;
-       drive->mult_req = arg;
-       drive->special.b.set_multmode = 1;
-       (void) ide_do_drive_cmd (drive, &rq, ide_wait);
-#endif /* __TASKFILE__IO */
-       return (drive->mult_count == arg) ? 0 : -EIO;
-}
-
-static int set_nowerr(ide_drive_t *drive, int arg)
-{
-       if (ide_spin_wait_hwgroup(drive))
-               return -EBUSY;
-       drive->nowerr = arg;
-       drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
-       spin_unlock_irq(&io_request_lock);
-       return 0;
-}
-
-static int write_cache (ide_drive_t *drive, int arg)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.feature        = (arg) ? SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
-       taskfile.command        = WIN_SETFEATURES;
-
-       if (!(drive->id->cfs_enable_2 & 0x3000))
-               return 1;
-
-       (void) ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-       drive->wcache = arg;
-       return 0;
-}
-
-static int do_idedisk_standby (ide_drive_t *drive)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       taskfile.command        = WIN_STANDBYNOW1;
-       return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-}
-
-static int do_idedisk_flushcache (ide_drive_t *drive)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-       if (drive->id->cfs_enable_2 & 0x2400) {
-               taskfile.command        = WIN_FLUSH_CACHE_EXT;
-       } else {
-               taskfile.command        = WIN_FLUSH_CACHE;
-       }
-       return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-}
-
-static int set_acoustic (ide_drive_t *drive, int arg)
-{
-       struct hd_drive_task_hdr taskfile;
-       struct hd_drive_hob_hdr hobfile;
-       memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
-       memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-
-       taskfile.feature        = (arg)?SETFEATURES_EN_AAM:SETFEATURES_DIS_AAM;
-       taskfile.sector_count   = arg;
-
-       taskfile.command        = WIN_SETFEATURES;
-       (void) ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
-       drive->acoustic = arg;
-       return 0;
-}
-
-static int probe_lba_addressing (ide_drive_t *drive, int arg)
-{
-       drive->addressing =  0;
-
-       if (!(drive->id->cfs_enable_2 & 0x0400))
-                return -EIO;
-
-       drive->addressing = arg;
-       return 0;
-}
-
-static int set_lba_addressing (ide_drive_t *drive, int arg)
-{
-       return (probe_lba_addressing(drive, arg));
-}
-
-static void idedisk_add_settings(ide_drive_t *drive)
-{
-       struct hd_driveid *id = drive->id;
-#if 0
-       int major = HWIF(drive)->major;
-       int minor = drive->select.b.unit << PARTN_BITS;
-#endif
-
-       ide_add_setting(drive,  "bios_cyl",             SETTING_RW,                                     -1,                     -1,                     TYPE_INT,       0,      65535,                          1,      1,      &drive->bios_cyl,               NULL);
-       ide_add_setting(drive,  "bios_head",            SETTING_RW,                                     -1,                     -1,                     TYPE_BYTE,      0,      255,                            1,      1,      &drive->bios_head,              NULL);
-       ide_add_setting(drive,  "bios_sect",            SETTING_RW,                                     -1,                     -1,                     TYPE_BYTE,      0,      63,                             1,      1,      &drive->bios_sect,              NULL);
-       ide_add_setting(drive,  "address",              SETTING_RW,                                     HDIO_GET_ADDRESS,       HDIO_SET_ADDRESS,       TYPE_INTA,      0,      2,                              1,      1,      &drive->addressing,     set_lba_addressing);
-       ide_add_setting(drive,  "bswap",                SETTING_READ,                                   -1,                     -1,                     TYPE_BYTE,      0,      1,                              1,      1,      &drive->bswap,                  NULL);
-       ide_add_setting(drive,  "multcount",            id ? SETTING_RW : SETTING_READ,                 HDIO_GET_MULTCOUNT,     HDIO_SET_MULTCOUNT,     TYPE_BYTE,      0,      id ? id->max_multsect : 0,      1,      1,      &drive->mult_count,             set_multcount);
-       ide_add_setting(drive,  "nowerr",               SETTING_RW,                                     HDIO_GET_NOWERR,        HDIO_SET_NOWERR,        TYPE_BYTE,      0,      1,                              1,      1,      &drive->nowerr,                 set_nowerr);
-#if 0
-       ide_add_setting(drive,  "breada_readahead",     SETTING_RW,                                     BLKRAGET,               BLKRASET,               TYPE_INT,       0,      255,                            1,      1,      &read_ahead[major],             NULL);
-       ide_add_setting(drive,  "file_readahead",       SETTING_RW,                                     BLKFRAGET,              BLKFRASET,              TYPE_INTA,      0,      4096,                   PAGE_SIZE,      1024,   &max_readahead[major][minor],   NULL);
-       ide_add_setting(drive,  "max_kb_per_request",   SETTING_RW,                                     BLKSECTGET,             BLKSECTSET,             TYPE_INTA,      1,      255,                            1,      1,      &max_sectors[major][minor],     NULL);
-#endif
-       ide_add_setting(drive,  "lun",                  SETTING_RW,                                     -1,                     -1,                     TYPE_INT,       0,      7,                              1,      1,      &drive->lun,                    NULL);
-       ide_add_setting(drive,  "wcache",               SETTING_RW,                                     HDIO_GET_WCACHE,        HDIO_SET_WCACHE,        TYPE_BYTE,      0,      1,                              1,      1,      &drive->wcache,                 write_cache);
-       ide_add_setting(drive,  "acoustic",             SETTING_RW,                                     HDIO_GET_ACOUSTIC,      HDIO_SET_ACOUSTIC,      TYPE_BYTE,      0,      254,                            1,      1,      &drive->acoustic,               set_acoustic);
-       ide_add_setting(drive,  "failures",             SETTING_RW,                                     -1,                     -1,                     TYPE_INT,       0,      65535,                          1,      1,      &drive->failures,               NULL);
-       ide_add_setting(drive,  "max_failures",         SETTING_RW,                                     -1,                     -1,                     TYPE_INT,       0,      65535,                          1,      1,      &drive->max_failures,           NULL);
-}
-
-static void idedisk_setup (ide_drive_t *drive)
-{
-       int i;
-       
-       struct hd_driveid *id = drive->id;
-       unsigned long capacity;
-       
-       idedisk_add_settings(drive);
-
-       if (id == NULL)
-               return;
-
-       /*
-        * CompactFlash cards and their brethern look just like hard drives
-        * to us, but they are removable and don't have a doorlock mechanism.
-        */
-       if (drive->removable && !drive_is_flashcard(drive)) {
-               /*
-                * Removable disks (eg. SYQUEST); ignore 'WD' drives 
-                */
-               if (id->model[0] != 'W' || id->model[1] != 'D') {
-                       drive->doorlocking = 1;
-               }
-       }
-       for (i = 0; i < MAX_DRIVES; ++i) {
-               ide_hwif_t *hwif = HWIF(drive);
-
-               if (drive != &hwif->drives[i]) continue;
-#ifdef DEVFS_MUST_DIE
-               hwif->gd->de_arr[i] = drive->de;
-#endif
-               if (drive->removable)
-                       hwif->gd->flags[i] |= GENHD_FL_REMOVABLE;
-               break;
-       }
-
-       /* Extract geometry if we did not already have one for the drive */
-       if (!drive->cyl || !drive->head || !drive->sect) {
-               drive->cyl     = drive->bios_cyl  = id->cyls;
-               drive->head    = drive->bios_head = id->heads;
-               drive->sect    = drive->bios_sect = id->sectors;
-       }
-
-       /* Handle logical geometry translation by the drive */
-       if ((id->field_valid & 1) && id->cur_cyls &&
-           id->cur_heads && (id->cur_heads <= 16) && id->cur_sectors) {
-               drive->cyl  = id->cur_cyls;
-               drive->head = id->cur_heads;
-               drive->sect = id->cur_sectors;
-       }
-
-       /* Use physical geometry if what we have still makes no sense */
-       if (drive->head > 16 && id->heads && id->heads <= 16) {
-               drive->cyl  = id->cyls;
-               drive->head = id->heads;
-               drive->sect = id->sectors;
-       }
-
-       /* calculate drive capacity, and select LBA if possible */
-       init_idedisk_capacity (drive);
-
-       /*
-        * if possible, give fdisk access to more of the drive,
-        * by correcting bios_cyls:
-        */
-       capacity = idedisk_capacity (drive);
-       if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) &&
-           (!drive->forced_geom) && drive->bios_sect && drive->bios_head)
-               drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head;
-       printk (KERN_INFO "XEN %s: %ld sectors", drive->name, capacity);
-
-       /* Give size in megabytes (MB), not mebibytes (MiB). */
-       /* We compute the exact rounded value, avoiding overflow. */
-       printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950);
-
-       /* Only print cache size when it was specified */
-       if (id->buf_size)
-               printk (" w/%dKiB Cache", id->buf_size/2);
-
-       printk(", CHS=%d/%d/%d", 
-              drive->bios_cyl, drive->bios_head, drive->bios_sect);
-#ifdef CONFIG_BLK_DEV_IDEDMA
-       if (drive->using_dma)
-               (void) HWIF(drive)->dmaproc(ide_dma_verbose, drive);
-#endif /* CONFIG_BLK_DEV_IDEDMA */
-       printk("\n");
-
-       drive->mult_count = 0;
-       if (id->max_multsect) {
-#ifdef CONFIG_IDEDISK_MULTI_MODE
-               id->multsect = ((id->max_multsect/2) > 1) ? id->max_multsect : 0;
-               id->multsect_valid = id->multsect ? 1 : 0;
-               drive->mult_req = id->multsect_valid ? id->max_multsect : INITIAL_MULT_COUNT;
-               drive->special.b.set_multmode = drive->mult_req ? 1 : 0;
-#else  /* original, pre IDE-NFG, per request of AC */
-               drive->mult_req = INITIAL_MULT_COUNT;
-               if (drive->mult_req > id->max_multsect)
-                       drive->mult_req = id->max_multsect;
-               if (drive->mult_req || ((id->multsect_valid & 1) && id->multsect))
-                       drive->special.b.set_multmode = 1;
-#endif /* CONFIG_IDEDISK_MULTI_MODE */
-       }
-       drive->no_io_32bit = id->dword_io ? 1 : 0;
-       if (drive->id->cfs_enable_2 & 0x3000)
-               write_cache(drive, (id->cfs_enable_2 & 0x3000));
-       (void) probe_lba_addressing(drive, 1);
-}
-
-static int idedisk_cleanup (ide_drive_t *drive)
-{
-       if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
-               if (do_idedisk_flushcache(drive))
-                       printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n",
-                               drive->name);
-       return ide_unregister_subdriver(drive);
-}
-
-int idedisk_reinit(ide_drive_t *drive);
-
-/*
- *      IDE subdriver functions, registered with ide.c
- */
-static ide_driver_t idedisk_driver = {
-       name:                   "ide-disk",
-       version:                IDEDISK_VERSION,
-       media:                  ide_disk,
-       busy:                   0,
-       supports_dma:           1,
-       supports_dsc_overlap:   0,
-       cleanup:                idedisk_cleanup,
-       standby:                do_idedisk_standby,
-       flushcache:             do_idedisk_flushcache,
-       do_request:             do_rw_disk,
-       end_request:            NULL,
-       ioctl:                  NULL,
-       open:                   idedisk_open,
-       release:                idedisk_release,
-       media_change:           idedisk_media_change,
-       revalidate:             idedisk_revalidate,
-       pre_reset:              idedisk_pre_reset,
-       capacity:               idedisk_capacity,
-       special:                idedisk_special,
-       /*proc:                 idedisk_proc,*/
-       reinit:                 idedisk_reinit,
-       ata_prebuilder:         NULL,
-       atapi_prebuilder:       NULL,
-};
-
-int idedisk_init (void);
-static ide_module_t idedisk_module = {
-       IDE_DRIVER_MODULE,
-       idedisk_init,
-       &idedisk_driver,
-       NULL
-};
-
-MODULE_DESCRIPTION("ATA DISK Driver");
-
-int idedisk_reinit (ide_drive_t *drive)
-{
-       int failed = 0;
-
-       MOD_INC_USE_COUNT;
-
-       if (ide_register_subdriver (drive, &idedisk_driver, IDE_SUBDRIVER_VERSION)) {
-               printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name);
-               return 1;
-       }
-       DRIVER(drive)->busy++;
-       idedisk_setup(drive);
-       if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
-               printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", drive->name, drive->head);
-               (void) idedisk_cleanup(drive);
-               DRIVER(drive)->busy--;
-               return 1;
-       }
-       DRIVER(drive)->busy--;
-       failed--;
-
-       ide_register_module(&idedisk_module);
-       MOD_DEC_USE_COUNT;
-       return 0;
-}
-
-static void __exit idedisk_exit (void)
-{
-       ide_drive_t *drive;
-       int failed = 0;
-
-       while ((drive = ide_scan_devices (ide_disk, idedisk_driver.name, &idedisk_driver, failed)) != NULL) {
-               if (idedisk_cleanup (drive)) {
-                       printk (KERN_ERR "%s: cleanup_module() called while still busy\n", drive->name);
-                       failed++;
-               }
-               /* We must remove proc entries defined in this module.
-                  Otherwise we oops while accessing these entries */
-#ifdef CONFIG_PROC_FS
-               if (drive->proc)
-                       ide_remove_proc_entries(drive->proc, idedisk_proc);
-#endif
-       }
-       ide_unregister_module(&idedisk_module);
-}
-
-int idedisk_init (void)
-{
-       ide_drive_t *drive;
-       int failed = 0;
-       
-       MOD_INC_USE_COUNT;
-       while ((drive = ide_scan_devices (ide_disk, idedisk_driver.name, NULL, failed++)) != NULL) {
-               if (ide_register_subdriver (drive, &idedisk_driver, IDE_SUBDRIVER_VERSION)) {
-                       printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name);
-                       continue;
-               }
-               DRIVER(drive)->busy++;
-               idedisk_setup(drive);
-               if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
-                       printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", drive->name, drive->head);
-                       (void) idedisk_cleanup(drive);
-                       DRIVER(drive)->busy--;
-                       continue;
-               }
-               DRIVER(drive)->busy--;
-               failed--;
-       }
-       ide_register_module(&idedisk_module);
-       MOD_DEC_USE_COUNT;
-       return 0;
-}
-
-module_init(idedisk_init);
-module_exit(idedisk_exit);
-MODULE_LICENSE("GPL");
index c68ff3684747f57db508067573d09dd84a72dbc0..c8784c6f3d6c0b7455f39c2ab7cfa4c2dc811788 100644 (file)
  *  configuration of all PCI IDE interfaces present in a system.  
  */
 
-#include <xeno/config.h>
-#include <xeno/types.h>
-#include <xeno/lib.h>
-#include <xeno/timer.h>
-#include <xeno/mm.h>
-#include <xeno/interrupt.h>
-#include <xeno/pci.h>
-#include <xeno/init.h>
-#include <xeno/ide.h>
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/ide.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -405,7 +405,7 @@ static ide_pci_device_t ide_pci_chipsets[] __initdata = {
 #ifndef CONFIG_PDC202XX_FORCE
         {DEVID_PDC20246,"PDC20246",    PCI_PDC202XX,   NULL,           INIT_PDC202XX,  NULL,           {{0x00,0x00,0x00}, {0x00,0x00,0x00}},   OFF_BOARD,      16 },
         {DEVID_PDC20262,"PDC20262",    PCI_PDC202XX,   ATA66_PDC202XX, INIT_PDC202XX,  NULL,           {{0x00,0x00,0x00}, {0x00,0x00,0x00}},   OFF_BOARD,      48 },
-        {DEVID_PDC20265,"PDC20265",    PCI_PDC202XX,   ATA66_PDC202XX, INIT_PDC202XX,  NULL,           {{0x00,0x00,0x00}, {0x00,0x00,0x00}},   ON_BOARD,       48 },
+        {DEVID_PDC20265,"PDC20265",    PCI_PDC202XX,   ATA66_PDC202XX, INIT_PDC202XX,  NULL,           {{0x00,0x00,0x00}, {0x00,0x00,0x00}},   OFF_BOARD,      48 },
         {DEVID_PDC20267,"PDC20267",    PCI_PDC202XX,   ATA66_PDC202XX, INIT_PDC202XX,  NULL,           {{0x00,0x00,0x00}, {0x00,0x00,0x00}},   OFF_BOARD,      48 },
 #else /* !CONFIG_PDC202XX_FORCE */
        {DEVID_PDC20246,"PDC20246",     PCI_PDC202XX,   NULL,           INIT_PDC202XX,  NULL,           {{0x50,0x02,0x02}, {0x50,0x04,0x04}},   OFF_BOARD,      16 },
@@ -623,8 +623,12 @@ static void __init ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_t *
        }
 
        if (pci_enable_device(dev)) {
-               printk(KERN_WARNING "%s: (ide_setup_pci_device:) Could not enable device.\n", d->name);
-               return;
+               if(pci_enable_device_bars(dev, 1<<4))
+               {
+                       printk(KERN_WARNING "%s: (ide_setup_pci_device:) Could not enable device.\n", d->name);
+                       return;
+               }
+               printk(KERN_INFO "%s: BIOS setup was incomplete.\n", d->name);
        }
 
 check_if_enabled:
@@ -669,18 +673,27 @@ check_if_enabled:
         */
        pciirq = dev->irq;
        
-#ifdef CONFIG_PDC202XX_FORCE
-       if (dev->class >> 8 == PCI_CLASS_STORAGE_RAID) {
-               /*
-                * By rights we want to ignore Promise FastTrak and SuperTrak
-                * series here, those use own driver.
+       if (dev->class >> 8 == PCI_CLASS_STORAGE_RAID)
+       {
+           /*  By rights we want to ignore these, but the Promise Fastrak
+                *      people have some strange ideas about proprietary so we have
+                *      to act otherwise on those. The supertrak however we need
+                *      to skip 
                 */
-               if (dev->vendor == PCI_VENDOR_ID_PROMISE) {
-                       printk(KERN_INFO "ide: Skipping Promise RAID controller.\n");
-                       return;
+               if (IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20265))
+               {
+                       printk(KERN_INFO "ide: Found promise 20265 in RAID mode.\n");
+                       if(dev->bus->self && dev->bus->self->vendor == PCI_VENDOR_ID_INTEL &&
+                          dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960)
+                       {
+                               printk(KERN_INFO "ide: Skipping Promise PDC20265 attached to I2O RAID controller.\n");
+                               return;
+                       }
                }
+               /* Its attached to something else, just a random bridge.
+                  Suspect a fastrak and fall through */
        }
-#endif /* CONFIG_PDC202XX_FORCE */
+
        if ((dev->class & ~(0xfa)) != ((PCI_CLASS_STORAGE_IDE << 8) | 5)) {
                printk("%s: not 100%% native mode: will probe irqs later\n", d->name);
                /*
index ca6629e9ef8a1ebdc1416fb6508bd7a58dbca486..fe538429f3fe4e6ab2e56cf0c08c6716725ff210 100644 (file)
@@ -92,6 +92,9 @@ static int piix_get_info (char *buffer, char **addr, off_t offset, int count)
                case PCI_DEVICE_ID_INTEL_82801BA_8:
                case PCI_DEVICE_ID_INTEL_82801BA_9:
                case PCI_DEVICE_ID_INTEL_82801CA_10:
+               case PCI_DEVICE_ID_INTEL_82801CA_11:
+               case PCI_DEVICE_ID_INTEL_82801DB_11:
+               case PCI_DEVICE_ID_INTEL_82801E_11:
                        p += sprintf(p, "\n                                Intel PIIX4 Ultra 100 Chipset.\n");
                        break;
                case PCI_DEVICE_ID_INTEL_82372FB_1:
@@ -258,8 +261,8 @@ static void piix_tune_drive (ide_drive_t *drive, byte pio)
                        master_data = master_data | 0x0070;
                pci_read_config_byte(HWIF(drive)->pci_dev, slave_port, &slave_data);
                slave_data = slave_data & (HWIF(drive)->index ? 0x0f : 0xf0);
-               slave_data = slave_data | ((timings[pio][0] << 2) | (timings[pio][1]
-                                          << (HWIF(drive)->index ? 4 : 0)));
+               slave_data = slave_data | (((timings[pio][0] << 2) | timings[pio][1])
+                                          << (HWIF(drive)->index ? 4 : 0));
        } else {
                master_data = master_data & 0xccf8;
                if (pio > 1)
@@ -366,7 +369,10 @@ static int piix_config_drive_for_dma (ide_drive_t *drive)
        byte udma_66            = eighty_ninty_three(drive);
        int ultra100            = ((dev->device == PCI_DEVICE_ID_INTEL_82801BA_8) ||
                                   (dev->device == PCI_DEVICE_ID_INTEL_82801BA_9) ||
-                                  (dev->device == PCI_DEVICE_ID_INTEL_82801CA_10)) ? 1 : 0;
+                                  (dev->device == PCI_DEVICE_ID_INTEL_82801CA_10) ||
+                                  (dev->device == PCI_DEVICE_ID_INTEL_82801CA_11) ||
+                                  (dev->device == PCI_DEVICE_ID_INTEL_82801DB_11) ||
+                                  (dev->device == PCI_DEVICE_ID_INTEL_82801E_11)) ? 1 : 0;
        int ultra66             = ((ultra100) ||
                                   (dev->device == PCI_DEVICE_ID_INTEL_82801AA_1) ||
                                   (dev->device == PCI_DEVICE_ID_INTEL_82372FB_1)) ? 1 : 0;
@@ -425,7 +431,7 @@ static int config_drive_xfer_rate (ide_drive_t *drive)
                }
                dma_func = ide_dma_off_quietly;
                if (id->field_valid & 4) {
-                       if (id->dma_ultra & 0x002F) {
+                       if (id->dma_ultra & 0x003F) {
                                /* Force if Capable UltraDMA */
                                dma_func = piix_config_drive_for_dma(drive);
                                if ((id->field_valid & 2) &&
index 7c718080e2573fc32eb818e68246fd18ab557b45..c0c242010ebac8f5199857fa71861eb34b1d7deb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     Generate devlist.h and classlist.h from the PCI ID file.
  *
- *     (c) 1999--2000 Martin Mares <mj@ucw.cz>
+ *     (c) 1999--2002 Martin Mares <mj@ucw.cz>
  */
 
 #include <stdio.h>
@@ -15,8 +15,13 @@ pq(FILE *f, const char *c)
        while (*c) {
                if (*c == '"')
                        fprintf(f, "\\\"");
-               else
+               else {
                        fputc(*c, f);
+                       if (*c == '?' && c[1] == '?') {
+                               /* Avoid trigraphs */
+                               fprintf(f, "\" \"");
+                       }
+               }
                c++;
        }
 }
index 90bb37e3829155573d96873ff3ac1670b3452563..80674543b0f6c8bbc32d44611719e7a0d94d536f 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
 #include <linux/init.h>
 
@@ -32,18 +32,18 @@ struct pci_vendor_info {
  * real memory.. Parse the same file multiple times
  * to get all the info.
  */
-#define VENDOR( vendor, name )         static char __vendorstr_##vendor[] __initdata = name;
+#define VENDOR( vendor, name )         static char __vendorstr_##vendor[] __devinitdata = name;
 #define ENDVENDOR()
-#define DEVICE( vendor, device, name )         static char __devicestr_##vendor##device[] __initdata = name;
+#define DEVICE( vendor, device, name )         static char __devicestr_##vendor##device[] __devinitdata = name;
 #include "devlist.h"
 
 
-#define VENDOR( vendor, name )         static struct pci_device_info __devices_##vendor[] __initdata = {
+#define VENDOR( vendor, name )         static struct pci_device_info __devices_##vendor[] __devinitdata = {
 #define ENDVENDOR()                    };
 #define DEVICE( vendor, device, name ) { 0x##device, 0, __devicestr_##vendor##device },
 #include "devlist.h"
 
-static struct pci_vendor_info __initdata pci_vendor_list[] = {
+static struct pci_vendor_info __devinitdata pci_vendor_list[] = {
 #define VENDOR( vendor, name )         { 0x##vendor, sizeof(__devices_##vendor) / sizeof(struct pci_device_info), __vendorstr_##vendor, __devices_##vendor },
 #define ENDVENDOR()
 #define DEVICE( vendor, device, name )
@@ -121,7 +121,7 @@ pci_class_name(u32 class)
 
 #else
 
-void __init pci_name_device(struct pci_dev *dev)
+void __devinit pci_name_device(struct pci_dev *dev)
 {
 }
 
index 8f0a972dd74500557d3dd744f851d9b2eb80e42c..7f49d463d54d63c6703912a5d7d0fad43a63759b 100644 (file)
 #include <linux/sched.h>
 #include <linux/module.h>
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
-//#include <linux/string.h>
+/*#include <linux/string.h>*/
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
 #include <linux/spinlock.h>
-//#include <linux/pm.h>
-//#include <linux/kmod.h>              /* for hotplug_path */
-//#include <linux/bitops.h>
+/*#include <linux/pm.h>*/
+/*#include <linux/kmod.h>*/            /* for hotplug_path */
+/*#include <linux/bitops.h>*/
 #include <linux/delay.h>
+#include <linux/cache.h>
 
 #include <asm/page.h>
-//#include <asm/dma.h> /* isa_dma_bridge_buggy */
+/*#include <asm/dma.h>*/       /* isa_dma_bridge_buggy */
 
 #undef DEBUG
 
@@ -358,24 +359,40 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer)
 }
 
 /**
- * pci_enable_device - Initialize device before it's used by a driver.
+ * pci_enable_device_bars - Initialize some of a device for use
  * @dev: PCI device to be initialized
+ * @bars: bitmask of BAR's that must be configured
  *
  *  Initialize device before it's used by a driver. Ask low-level code
- *  to enable I/O and memory. Wake up the device if it was suspended.
- *  Beware, this function can fail.
+ *  to enable selected I/O and memory resources. Wake up the device if it 
+ *  was suspended. Beware, this function can fail.
  */
 int
-pci_enable_device(struct pci_dev *dev)
+pci_enable_device_bars(struct pci_dev *dev, int bars)
 {
        int err;
 
        pci_set_power_state(dev, 0);
-       if ((err = pcibios_enable_device(dev)) < 0)
+       if ((err = pcibios_enable_device(dev, bars)) < 0)
                return err;
        return 0;
 }
 
+/**
+ * pci_enable_device - Initialize device before it's used by a driver.
+ * @dev: PCI device to be initialized
+ *
+ *  Initialize device before it's used by a driver. Ask low-level code
+ *  to enable I/O and memory. Wake up the device if it was suspended.
+ *  Beware, this function can fail.
+ */
+int
+pci_enable_device(struct pci_dev *dev)
+{
+       return pci_enable_device_bars(dev, 0x3F);
+}
+
 /**
  * pci_disable_device - Disable PCI device after use
  * @dev: PCI device to be disabled
@@ -462,6 +479,69 @@ pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge)
        return pin;
 }
 
+/**
+ *     pci_release_region - Release a PCI bar
+ *     @pdev: PCI device whose resources were previously reserved by pci_request_region
+ *     @bar: BAR to release
+ *
+ *     Releases the PCI I/O and memory resources previously reserved by a
+ *     successful call to pci_request_region.  Call this function only
+ *     after all use of the PCI regions has ceased.
+ */
+void pci_release_region(struct pci_dev *pdev, int bar)
+{
+       if (pci_resource_len(pdev, bar) == 0)
+               return;
+       if (pci_resource_flags(pdev, bar) & IORESOURCE_IO)
+               release_region(pci_resource_start(pdev, bar),
+                               pci_resource_len(pdev, bar));
+       else if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM)
+               release_mem_region(pci_resource_start(pdev, bar),
+                               pci_resource_len(pdev, bar));
+}
+
+/**
+ *     pci_request_region - Reserved PCI I/O and memory resource
+ *     @pdev: PCI device whose resources are to be reserved
+ *     @bar: BAR to be reserved
+ *     @res_name: Name to be associated with resource.
+ *
+ *     Mark the PCI region associated with PCI device @pdev BR @bar as
+ *     being reserved by owner @res_name.  Do not access any
+ *     address inside the PCI regions unless this call returns
+ *     successfully.
+ *
+ *     Returns 0 on success, or %EBUSY on error.  A warning
+ *     message is also printed on failure.
+ */
+int pci_request_region(struct pci_dev *pdev, int bar, char *res_name)
+{
+       if (pci_resource_len(pdev, bar) == 0)
+               return 0;
+               
+       if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) {
+               if (!request_region(pci_resource_start(pdev, bar),
+                           pci_resource_len(pdev, bar), res_name))
+                       goto err_out;
+       }
+       else if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) {
+               if (!request_mem_region(pci_resource_start(pdev, bar),
+                                       pci_resource_len(pdev, bar), res_name))
+                       goto err_out;
+       }
+       
+       return 0;
+
+err_out:
+       printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n",
+               pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem",
+               bar + 1, /* PCI BAR # */
+               pci_resource_len(pdev, bar), pci_resource_start(pdev, bar),
+               pdev->slot_name);
+       return -EBUSY;
+}
+
+
 /**
  *     pci_release_regions - Release reserved PCI I/O and memory resources
  *     @pdev: PCI device whose resources were previously reserved by pci_request_regions
@@ -470,22 +550,13 @@ pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge)
  *     successful call to pci_request_regions.  Call this function only
  *     after all use of the PCI regions has ceased.
  */
+
 void pci_release_regions(struct pci_dev *pdev)
 {
        int i;
        
-       for (i = 0; i < 6; i++) {
-               if (pci_resource_len(pdev, i) == 0)
-                       continue;
-
-               if (pci_resource_flags(pdev, i) & IORESOURCE_IO)
-                       release_region(pci_resource_start(pdev, i),
-                                      pci_resource_len(pdev, i));
-
-               else if (pci_resource_flags(pdev, i) & IORESOURCE_MEM)
-                       release_mem_region(pci_resource_start(pdev, i),
-                                          pci_resource_len(pdev, i));
-       }
+       for (i = 0; i < 6; i++)
+               pci_release_region(pdev, i);
 }
 
 /**
@@ -505,23 +576,9 @@ int pci_request_regions(struct pci_dev *pdev, char *res_name)
 {
        int i;
        
-       for (i = 0; i < 6; i++) {
-               if (pci_resource_len(pdev, i) == 0)
-                       continue;
-
-               if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
-                       if (!request_region(pci_resource_start(pdev, i),
-                                           pci_resource_len(pdev, i), res_name))
-                               goto err_out;
-               }
-               
-               else if (pci_resource_flags(pdev, i) & IORESOURCE_MEM) {
-                       if (!request_mem_region(pci_resource_start(pdev, i),
-                                               pci_resource_len(pdev, i), res_name))
-                               goto err_out;
-               }
-       }
-       
+       for (i = 0; i < 6; i++)
+               if(pci_request_region(pdev, i, res_name))
+                       goto err_out;
        return 0;
 
 err_out:
@@ -530,7 +587,9 @@ err_out:
                i + 1, /* PCI BAR # */
                pci_resource_len(pdev, i), pci_resource_start(pdev, i),
                pdev->slot_name);
-       pci_release_regions(pdev);
+       while(--i >= 0)
+               pci_release_region(pdev, i);
+               
        return -EBUSY;
 }
 
@@ -872,13 +931,14 @@ pdev_set_mwi(struct pci_dev *dev)
        pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cache_size);
        cache_size <<= 2;
        if (cache_size != SMP_CACHE_BYTES) {
-               printk(KERN_WARNING "PCI: %s PCI cache line size set incorrectly (%i bytes) by BIOS/FW.\n",
+               printk(KERN_WARNING "PCI: %s PCI cache line size set incorrectly "
+                      "(%i bytes) by BIOS/FW, ",
                       dev->slot_name, cache_size);
                if (cache_size > SMP_CACHE_BYTES) {
-                       printk("PCI: %s cache line size too large - expecting %i.\n", dev->slot_name, SMP_CACHE_BYTES);
+                       printk("expecting %i\n", SMP_CACHE_BYTES);
                        rc = -EINVAL;
                } else {
-                       printk("PCI: %s PCI cache line size corrected to %i.\n", dev->slot_name, SMP_CACHE_BYTES);
+                       printk("correcting to %i\n", SMP_CACHE_BYTES);
                        pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
                                              SMP_CACHE_BYTES >> 2);
                }
@@ -1008,13 +1068,15 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
                        l = 0;
                if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) {
                        res->start = l & PCI_BASE_ADDRESS_MEM_MASK;
+                       res->flags |= l & ~PCI_BASE_ADDRESS_MEM_MASK;
                        sz = pci_size(sz, PCI_BASE_ADDRESS_MEM_MASK);
                } else {
                        res->start = l & PCI_BASE_ADDRESS_IO_MASK;
+                       res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK;
                        sz = pci_size(sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff);
                }
                res->end = res->start + (unsigned long) sz;
-               res->flags |= (l & 0xf) | pci_calc_resource_flags(l);
+               res->flags |= pci_calc_resource_flags(l);
                if ((l & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK))
                    == (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64)) {
                        pci_read_config_dword(dev, reg+4, &l);
@@ -1058,7 +1120,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
        }
 }
 
-void __devinit  pci_read_bridge_bases(struct pci_bus *child)
+void __devinit pci_read_bridge_bases(struct pci_bus *child)
 {
        struct pci_dev *dev = child->self;
        u8 io_base_lo, io_limit_lo;
@@ -1070,6 +1132,13 @@ void __devinit  pci_read_bridge_bases(struct pci_bus *child)
        if (!dev)               /* It's a host bus, nothing to read */
                return;
 
+       if (dev->transparent) {
+               printk("Transparent bridge - %s\n", dev->name);
+               for(i = 0; i < 4; i++)
+                       child->resource[i] = child->parent->resource[i];
+               return;
+       }
+
        for(i=0; i<3; i++)
                child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
 
@@ -1091,14 +1160,6 @@ void __devinit  pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
                res->start = base;
                res->end = limit + 0xfff;
-               res->name = child->name;
-       } else {
-               /*
-                * Ugh. We don't know enough about this bridge. Just assume
-                * that it's entirely transparent.
-                */
-               printk(KERN_ERR "Unknown bridge resource %d: assuming transparent\n", 0);
-               child->resource[0] = child->parent->resource[0];
        }
 
        res = child->resource[1];
@@ -1110,11 +1171,6 @@ void __devinit  pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
                res->start = base;
                res->end = limit + 0xfffff;
-               res->name = child->name;
-       } else {
-               /* See comment above. Same thing */
-               printk(KERN_ERR "Unknown bridge resource %d: assuming transparent\n", 1);
-               child->resource[1] = child->parent->resource[1];
        }
 
        res = child->resource[2];
@@ -1141,15 +1197,10 @@ void __devinit  pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
                res->start = base;
                res->end = limit + 0xfffff;
-               res->name = child->name;
-       } else {
-               /* See comments above */
-               printk(KERN_ERR "Unknown bridge resource %d: assuming transparent\n", 2);
-               child->resource[2] = child->parent->resource[2];
        }
 }
 
-static struct pci_bus * __devinit  pci_alloc_bus(void)
+static struct pci_bus * __devinit pci_alloc_bus(void)
 {
        struct pci_bus *b;
 
@@ -1187,9 +1238,11 @@ struct pci_bus * __devinit pci_add_new_bus(struct pci_bus *parent, struct pci_de
        child->primary = parent->secondary;
        child->subordinate = 0xff;
 
-       /* Set up default resource pointers.. */
-       for (i = 0; i < 4; i++)
+       /* Set up default resource pointers and names.. */
+       for (i = 0; i < 4; i++) {
                child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i];
+               child->resource[i]->name = child->name;
+       }
 
        return child;
 }
@@ -1331,6 +1384,10 @@ int pci_setup_device(struct pci_dev * dev)
        case PCI_HEADER_TYPE_BRIDGE:                /* bridge header */
                if (class != PCI_CLASS_BRIDGE_PCI)
                        goto bad;
+               /* The PCI-to-PCI bridge spec requires that subtractive
+                  decoding (i.e. transparent) bridge must have programming
+                  interface code of 0x01. */ 
+               dev->transparent = ((dev->class & 0xff) == 1);
                pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
                break;
 
@@ -1474,7 +1531,7 @@ unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus)
        return max;
 }
 
-int __devinit  pci_bus_exists(const struct list_head *list, int nr)
+int __devinit pci_bus_exists(const struct list_head *list, int nr)
 {
        const struct list_head *l;
 
@@ -1486,7 +1543,7 @@ int __devinit  pci_bus_exists(const struct list_head *list, int nr)
        return 0;
 }
 
-struct pci_bus * __devinit  pci_alloc_primary_bus(int bus)
+struct pci_bus * __devinit pci_alloc_primary_bus(int bus)
 {
        struct pci_bus *b;
 
@@ -1505,7 +1562,7 @@ struct pci_bus * __devinit  pci_alloc_primary_bus(int bus)
        return b;
 }
 
-struct pci_bus * __devinit  pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata)
+struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata)
 {
        struct pci_bus *b = pci_alloc_primary_bus(bus);
        if (b) {
@@ -1639,7 +1696,7 @@ static int pci_pm_suspend(u32 state)
        return 0;
 }
 
-static int pci_pm_resume(void)
+int pci_pm_resume(void)
 {
        struct list_head *list;
        struct pci_bus *bus;
@@ -1659,10 +1716,10 @@ pci_pm_callback(struct pm_dev *pm_device, pm_request_t rqst, void *data)
 
        switch (rqst) {
        case PM_SAVE_STATE:
-               error = pci_pm_save_state((u32)data);
+               error = pci_pm_save_state((unsigned long)data);
                break;
        case PM_SUSPEND:
-               error = pci_pm_suspend((u32)data);
+               error = pci_pm_suspend((unsigned long)data);
                break;
        case PM_RESUME:
                error = pci_pm_resume();
@@ -2042,7 +2099,7 @@ void __devinit  pci_init(void)
 #endif
 }
 
-static int __devinit  pci_setup(char *str)
+static int __devinit pci_setup(char *str)
 {
        while (str) {
                char *k = strchr(str, ',');
@@ -2067,16 +2124,22 @@ EXPORT_SYMBOL(pci_write_config_word);
 EXPORT_SYMBOL(pci_write_config_dword);
 EXPORT_SYMBOL(pci_devices);
 EXPORT_SYMBOL(pci_root_buses);
+EXPORT_SYMBOL(pci_enable_device_bars);
 EXPORT_SYMBOL(pci_enable_device);
 EXPORT_SYMBOL(pci_disable_device);
 EXPORT_SYMBOL(pci_find_capability);
 EXPORT_SYMBOL(pci_release_regions);
 EXPORT_SYMBOL(pci_request_regions);
+EXPORT_SYMBOL(pci_release_region);
+EXPORT_SYMBOL(pci_request_region);
 EXPORT_SYMBOL(pci_find_class);
 EXPORT_SYMBOL(pci_find_device);
 EXPORT_SYMBOL(pci_find_slot);
 EXPORT_SYMBOL(pci_find_subsys);
 EXPORT_SYMBOL(pci_set_master);
+EXPORT_SYMBOL(pci_set_mwi);
+EXPORT_SYMBOL(pci_clear_mwi);
+EXPORT_SYMBOL(pdev_set_mwi);
 EXPORT_SYMBOL(pci_set_dma_mask);
 EXPORT_SYMBOL(pci_dac_set_dma_mask);
 EXPORT_SYMBOL(pci_assign_resource);
@@ -2094,10 +2157,14 @@ EXPORT_SYMBOL(pci_announce_device_to_drivers);
 EXPORT_SYMBOL(pci_add_new_bus);
 EXPORT_SYMBOL(pci_do_scan_bus);
 EXPORT_SYMBOL(pci_scan_slot);
+EXPORT_SYMBOL(pci_scan_bus);
+#ifdef CONFIG_PROC_FS
 EXPORT_SYMBOL(pci_proc_attach_device);
 EXPORT_SYMBOL(pci_proc_detach_device);
 EXPORT_SYMBOL(pci_proc_attach_bus);
 EXPORT_SYMBOL(pci_proc_detach_bus);
+EXPORT_SYMBOL(proc_bus_pci_dir);
+#endif
 #endif
 
 EXPORT_SYMBOL(pci_set_power_state);
index c73f0bd65bb320b8ea081a7abf69682007e10210..f45de74936ff8a2f9a7b5f04e18d71e12a8f1d74 100644 (file)
@@ -7,7 +7,7 @@
 #      so if you have anything to contribute, please visit the home page or
 #      send a diff -u against the most recent pci.ids to pci-ids@ucw.cz.
 #
-#      $Id: pci.ids,v 1.24 2001/10/28 21:55:26 mares Exp $
+#      $Id: pci.ids,v 1.46 2002/08/14 17:38:51 mares Exp $
 #
 
 # Vendors, devices and subsystems. Please keep sorted.
 0675  Dynalink
        1700  IS64PH ISDN Adapter
        1702  IS64PH ISDN Adapter
+# Wrong ID used in subsystem ID of VIA USB controllers.
+0925  VIA Technologies, Inc. (Wrong ID)
+09c1  Arris
+       0704  CM 200E Cable Modem
 0a89  BREA Technologies Inc
 0e11  Compaq Computer Corporation
        0001  PCI to EISA Bridge
@@ -47,7 +51,7 @@
        a0f7  PCI Hotplug Controller
                8086 002a  PCI Hotplug Controller A
                8086 002b  PCI Hotplug Controller B
-       a0f8  USB Open Host Controller
+       a0f8  ZFMicro Chipset USB
        a0fc  Fibre Channel Host Controller
        ae10  Smart-2/P RAID Controller
                0e11 4030  Smart-2/P Array Controller
        b13c  NC3162 Fast Ethernet NIC
        b144  NC3123 Fast Ethernet NIC
        b163  NC3134 Fast Ethernet NIC
-       b164  NC3135 Fast Ethernet Upgrade Module
+       b164  NC3165 Fast Ethernet Upgrade Module
        b178  Smart Array 5i/532
        b1a4  NC7131 Gigabit Server Adapter
        f130  NetFlex-3/P ThunderLAN 1.0
        f150  NetFlex-3/P ThunderLAN 2.3
+0e55  HaSoTec GmbH
 1000  LSI Logic / Symbios Logic (formerly NCR)
        0001  53c810
                1000 1000  8100S
        000a  53c1510
        000b  53c896
        000c  53c895
+               1de1 3907  DC-390U2W
        000d  53c885
        000f  53c875
                0e11 7004  Embedded Ultra Wide SCSI Controller
                1092 8760  FirePort 40 Dual SCSI Controller
                1de1 3904  DC390F Ultra Wide SCSI Controller
+       0010  53c895
+               0e11 4040  Integrated Array Controller
+               0e11 4048  Integrated Array Controller
        0012  53c895a
+       0013  53c875a
        0020  53c1010 Ultra3 SCSI Adapter
+               1de1 1020  DC-390U3W
        0021  53c1010 66MHz  Ultra3 SCSI Adapter
        0030  53c1030
+               1028 1010  LSI U320 SCSI Controller
        0040  53c1035
        008f  53c875J
                1092 8000  FirePort 40 SCSI Controller
        0623  FC929 LAN
        0624  FC919
        0625  FC919 LAN
-       0701  83C885
+       0626  FC929X
+       0627  FC929X LAN
+       0628  FC919X
+       0629  FC919X LAN
+       0701  83C885 NT50 DigitalScape Fast Ethernet
        0702  Yellowfin G-NIC gigabit ethernet
                1318 0000  PEI100X
        0901  61C102
        1000  63C815
-1001  Initio
+       1960  PowerEdge Expandable RAID Controller 4
+               1028 0518  PowerEdge Expandable RAID Controller 4/DC
+               1028 0520  PowerEdge Expandable RAID Controller 4/SC
+               1028 0531  PowerEdge Expandable RAID Controller 4/QC
+1001  Kolter Electronic
        0010  PCI 1616 Measurement card with 32 digital I/O lines
        0011  OPTO-PCI Opto-Isolated digital I/O board
        0012  PCI-AD/DA Analogue I/O board
        9100  INI-9100/9100W SCSI Host
 1002  ATI Technologies Inc
        4158  68800AX [Mach32]
+       4242  Radeon 8500 DV
+               1002 02aa  Radeon 8500 AIW DV Edition
        4354  215CT [Mach64 CT]
        4358  210888CX [Mach64 CX]
        4554  210888ET [Mach64 ET]
        4654  Mach64 VT
        4742  3D Rage Pro AGP 1X/2X
+               1002 0040  Rage Pro Turbo AGP 2X
+               1002 0044  Rage Pro Turbo AGP 2X
+               1002 0061  Rage Pro AIW AGP 2X
+               1002 0062  Rage Pro AIW AGP 2X
+               1002 0063  Rage Pro AIW AGP 2X
+               1002 0080  Rage Pro Turbo AGP 2X
+               1002 0084  Rage Pro Turbo AGP 2X
+               1002 4742  Rage Pro Turbo AGP 2X
+               1002 8001  Rage Pro Turbo AGP 2X
+               1028 0082  Rage Pro Turbo AGP 2X
                1028 4082  Optiplex GX1 Onboard Display Adapter
-               8086 4152  Rage 3D Pro AGP
+               1028 8082  Rage Pro Turbo AGP 2X
+               1028 c082  Rage Pro Turbo AGP 2X
+               8086 4152  Xpert 98D AGP 2X
+               8086 464a  Rage Pro Turbo AGP 2X
        4744  3D Rage Pro AGP 1X
+               1002 4744  Rage Pro Turbo AGP
        4747  3D Rage Pro
        4749  3D Rage Pro
+               1002 0061  Rage Pro AIW
+               1002 0062  Rage Pro AIW
        474c  Rage XC
-       474d  Rage XL AGP
+       474d  Rage XL AGP 2X
+               1002 0004  Xpert 98 RXL AGP 2X
+               1002 0008  Xpert 98 RXL AGP 2X
+               1002 0080  Rage XL AGP 2X
+               1002 0084  Xpert 98 AGP 2X
+               1002 474d  Rage XL AGP
+               1033 806a  Rage XL AGP
        474e  Rage XC AGP
+               1002 474e  Rage XC AGP
        474f  Rage XL
+               1002 0008  Rage XL
+               1002 474f  Rage XL
        4750  3D Rage Pro 215GP
+               1002 0040  Rage Pro Turbo
+               1002 0044  Rage Pro Turbo
+               1002 0080  Rage Pro Turbo
+               1002 0084  Rage Pro Turbo
+               1002 4750  Rage Pro Turbo
        4751  3D Rage Pro 215GQ
        4752  Rage XL
+               1002 0008  Rage XL
+               1002 4752  Rage XL
        4753  Rage XC
+               1002 4753  Rage XC
        4754  3D Rage I/II 215GT [Mach64 GT]
        4755  3D Rage II+ 215GTB [Mach64 GTB]
        4756  3D Rage IIC 215IIC [Mach64 GT IIC]
+               1002 4756  Rage IIC
        4757  3D Rage IIC AGP
+               1002 4757  Rage IIC AGP
                1028 0089  Rage 3D IIC
                1028 4082  Rage 3D IIC
                1028 8082  Rage 3D IIC
        4759  3D Rage IIC
        475a  3D Rage IIC AGP
                1002 0087  Rage 3D IIC
+               1002 475a  Rage IIC AGP
        4c42  3D Rage LT Pro AGP-133
                0e11 b0e8  Rage 3D LT Pro
                0e11 b10e  3D Rage LT Pro (Compaq Armada 1750)
+               1002 0040  Rage LT Pro AGP 2X
+               1002 0044  Rage LT Pro AGP 2X
+               1002 4c42  Rage LT Pro AGP 2X
+               1002 8001  Rage LT Pro AGP 2X
                1028 0085  Rage 3D LT Pro
        4c44  3D Rage LT Pro AGP-66
        4c45  Rage Mobility M3 AGP
        4c46  Rage Mobility M3 AGP 2x
        4c47  3D Rage LT-G 215LG
        4c49  3D Rage LT Pro
+               1002 0004  Rage LT Pro
+               1002 0040  Rage LT Pro
+               1002 0044  Rage LT Pro
+               1002 4c49  Rage LT Pro
        4c4d  Rage Mobility P/M AGP 2x
+               1002 0084  Xpert 98 AGP 2X (Mobility)
        4c4e  Rage Mobility L AGP 2x
        4c50  3D Rage LT Pro
+               1002 4c50  Rage LT Pro
        4c51  3D Rage LT Pro
        4c52  Rage Mobility P/M
        4c53  Rage Mobility L
        4c54  264LT [Mach64 LT]
-       4c57  Radeon Mobility M6 LW
+       4c57  Radeon Mobility M7 LW
+               1028 00e6  Radeon Mobility M7 LW (Dell Inspiron 8100)
+       4c58  Radeon Mobility M7 LX [Radeon Mobility FireGL 7800]
        4c59  Radeon Mobility M6 LY
+               1014 0235  ThinkPad A30p (2653-64G)
+               1014 0239  ThinkPad X22/X23/X24
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
        4c5a  Radeon Mobility M6 LZ
        4d46  Rage Mobility M4 AGP
        4d4c  Rage Mobility M4 AGP
-       5041  Rage 128 PA
-       5042  Rage 128 PB
-       5043  Rage 128 PC
-       5044  Rage 128 PD
-       5045  Rage 128 PE
-       5046  Rage 128 PF
+       5041  Rage 128 PA/PRO
+       5042  Rage 128 PB/PRO AGP 2x
+       5043  Rage 128 PC/PRO AGP 4x
+       5044  Rage 128 PD/PRO TMDS
+               1002 0028  Rage 128 AIW
+               1002 0029  Rage 128 AIW
+       5045  Rage 128 PE/PRO AGP 2x TMDS
+       5046  Rage 128 PF/PRO AGP 4x TMDS
+               1002 0004  Rage Fury Pro
+               1002 0008  Rage Fury Pro/Xpert 2000 Pro
+               1002 0014  Rage Fury Pro
+               1002 0018  Rage Fury Pro/Xpert 2000 Pro
+               1002 0028  Rage 128 Pro AIW AGP
+               1002 002a  Rage 128 Pro AIW AGP
+               1002 0048  Rage Fury Pro
                1002 2000  Rage Fury MAXX AGP 4x (TMDS) (VGA device)
                1002 2001  Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)
-       5047  Rage 128 PG
-       5048  Rage 128 PH
-       5049  Rage 128 PI
-       504a  Rage 128 PJ
-       504b  Rage 128 PK
-       504c  Rage 128 PL
-       504d  Rage 128 PM
-       504e  Rage 128 PN
-       504f  Rage 128 PO
-       5050  Rage 128 PP
-       5051  Rage 128 PQ
-       5052  Rage 128 PR
-       5053  Rage 128 PS
-       5054  Rage 128 PT
-       5055  Rage 128 PU
-       5056  Rage 128 PV
-       5057  Rage 128 PW
-       5058  Rage 128 PX
+       5047  Rage 128 PG/PRO
+       5048  Rage 128 PH/PRO AGP 2x
+       5049  Rage 128 PI/PRO AGP 4x
+       504a  Rage 128 PJ/PRO TMDS
+       504b  Rage 128 PK/PRO AGP 2x TMDS
+       504c  Rage 128 PL/PRO AGP 4x TMDS
+       504d  Rage 128 PM/PRO
+       504e  Rage 128 PN/PRO AGP 2x
+       504f  Rage 128 PO/PRO AGP 4x
+       5050  Rage 128 PP/PRO TMDS
+               1002 0008  Xpert 128
+       5051  Rage 128 PQ/PRO AGP 2x TMDS
+       5052  Rage 128 PR/PRO AGP 4x TMDS
+       5053  Rage 128 PS/PRO
+       5054  Rage 128 PT/PRO AGP 2x
+       5055  Rage 128 PU/PRO AGP 4x
+       5056  Rage 128 PV/PRO TMDS
+       5057  Rage 128 PW/PRO AGP 2x TMDS
+       5058  Rage 128 PX/PRO AGP 4x TMDS
        5144  Radeon QD
+               1002 0008  Radeon 7000/Radeon VE
+               1002 0009  Radeon 7000/Radeon
+               1002 000a  Radeon 7000/Radeon
+               1002 001a  Radeon 7000/Radeon
+               1002 0029  Radeon AIW
+               1002 0038  Radeon 7000/Radeon
+               1002 0039  Radeon 7000/Radeon
+               1002 008a  Radeon 7000/Radeon
+               1002 00ba  Radeon 7000/Radeon
+               1002 0139  Radeon 7000/Radeon
+               1002 028a  Radeon 7000/Radeon
+               1002 02aa  Radeon AIW
+               1002 053a  Radeon 7000/Radeon
        5145  Radeon QE
        5146  Radeon QF
        5147  Radeon QG
+       5148  Radeon R200 QH [Radeon 8500]
+               1002 0152  FireGL 8800
+               1002 0172  FireGL 8700
+       5149  Radeon R200 QI
+       514a  Radeon R200 QJ
+       514b  Radeon R200 QK
+       514c  Radeon R200 QL [Radeon 8500 LE]
+               1002 003a  Radeon R200 QL [Radeon 8500 LE]
+               1002 013a  Radeon 8500
+       5157  Radeon 7500 QW
+               1002 013a  Radeon 7500
+               174b 7161  Radeon RV200 QW [Radeon 7500 LE]
+       5158  Radeon 7500 QX
        5159  Radeon VE QY
+               1002 000a  Radeon 7000/Radeon VE
+               1002 0038  Radeon 7000/Radeon VE
+               1002 003a  Radeon 7000/Radeon VE
+               1002 00ba  Radeon 7000/Radeon VE
+               1002 013a  Radeon 7000/Radeon VE
+               174b 7112  Radeon 7000 64M TVO
        515a  Radeon VE QZ
-       5245  Rage 128 RE
-       5246  Rage 128 RF
+       5168  Radeon R200 Qh
+       5169  Radeon R200 Qi
+       516a  Radeon R200 Qj
+       516b  Radeon R200 Qk
+       5245  Rage 128 RE/SG
+               1002 0008  Xpert 128
+               1002 0028  Rage 128 AIW
+               1002 0029  Rage 128 AIW
+               1002 0068  Rage 128 AIW
+       5246  Rage 128 RF/SG AGP
+               1002 0004  Magnum/Xpert 128/Xpert 99
+               1002 0008  Magnum/Xpert128/X99/Xpert2000
+               1002 0028  Rage 128 AIW AGP
+               1002 0044  Rage Fury/Xpert 128/Xpert 2000
+               1002 0068  Rage 128 AIW AGP
+               1002 0448  Rage Fury
        5247  Rage 128 RG
-       524b  Rage 128 RK
-       524c  Rage 128 RL
-       5345  Rage 128 SE
-       5346  Rage 128 SF
-       5347  Rage 128 SG
-       5348  Rage 128 4x
-       534b  Rage 128 SK
-       534c  Rage 128 SL
-       534d  Rage 128 SM
-       534e  Rage 128 SN
+       524b  Rage 128 RK/VR
+       524c  Rage 128 RL/VR AGP
+               1002 0008  Xpert 99/Xpert 2000
+               1002 0088  Xpert 99
+       5345  Rage 128 SE/4x
+       5346  Rage 128 SF/4x AGP 2x
+       5347  Rage 128 SG/4x AGP 4x
+       5348  Rage 128 SH
+       534b  Rage 128 SK/4x
+       534c  Rage 128 SL/4x AGP 2x
+       534d  Rage 128 SM/4x AGP 4x
+               1002 0008  Xpert 99/Xpert 2000
+               1002 0018  Xpert 2000
+       534e  Rage 128 4x
        5354  Mach 64 VT
                1002 5654  Mach 64 reference
-       5446  Rage 128 Pro TF
-       544c  Rage 128 Pro TL
-       5452  Rage 128 Pro TR
+       5446  Rage 128 Pro Ultra TF
+               1002 0004  Rage Fury Pro
+               1002 0008  Rage Fury Pro/Xpert 2000 Pro
+               1002 0018  Rage Fury Pro/Xpert 2000 Pro
+               1002 0028  Rage 128 AIW Pro AGP
+               1002 0029  Rage 128 AIW
+               1002 002a  Rage 128 AIW Pro AGP
+               1002 002b  Rage 128 AIW
+               1002 0048  Xpert 2000 Pro
+       544c  Rage 128 Pro Ultra TL
+       5452  Rage 128 Pro Ultra TR
+               1002 001c  Rage 128 Pro 4XL
+               103c 1279  Rage 128 Pro 4XL
+       5453  Rage 128 Pro Ultra TS
+       5454  Rage 128 Pro Ultra TT
+       5455  Rage 128 Pro Ultra TU
        5654  264VT [Mach64 VT]
                1002 5654  Mach64VT Reference
        5655  264VT3 [Mach64 VT3]
        000c  82C541 [Lynx]
        000d  82C543 [Lynx]
        0101  82C532
-       0102  82C534
+       0102  82C534 [Eagle]
        0103  82C538
        0104  82C535
        0105  82C147
        0001  DP83810
        0002  87415/87560 IDE
        000e  87560 Legacy I/O
-       000f  OHCI Compliant FireWire Controller
-       0011  National PCI System I/O
+       000f  FireWire Controller
+       0011  NS87560 National PCI System I/O
        0012  USB Controller
        0020  DP83815 (MacPhyter) Ethernet Controller
        0022  DP83820 10/100/1000 Ethernet Controller
+       0500  SCx200 Bridge
+       0501  SCx200 SMI
+       0502  SCx200 IDE
+       0503  SCx200 Audio
+       0504  SCx200 Video
+       0505  SCx200 XBus
        d001  87410 IDE
 100c  Tseng Labs Inc
        3202  ET4000/W32p rev A
        4702  ET6300
 100d  AST Research Inc
 100e  Weitek
-       9000  P9000
-       9001  P9000
-       9100  P9100
+       9000  P9000 Viper
+       9001  P9000 Viper
+       9002  P9000 Viper
+       9100  P9100 Viper Pro/SE
 1010  Video Logic, Ltd.
 1011  Digital Equipment Corporation
        0001  DECchip 21050
        0007  NVRAM [Zephyr NVRAM]
        0008  KZPSA [KZPSA]
        0009  DECchip 21140 [FasterNet]
+               1025 0310  21140 Fast Ethernet
                10b8 2001  SMC9332BDT EtherPower 10/100
                10b8 2002  SMC9332BVT EtherPower T4 10/100
                10b8 2003  SMC9334BDT EtherPower 10/100 (1-port)
                1186 1112  DFE-570TX Fast Ethernet
                1186 1140  DFE-660 Cardbus Ethernet 10/100
                1186 1142  DFE-660 Cardbus Ethernet 10/100
+               11f6 0503  Freedomline Fast Ethernet
                1282 9100  AEF-380TXD Fast Ethernet
                1385 1100  FA310TX Fast Ethernet
                2646 0001  KNE100TX Fast Ethernet
                1186 0100  DE-530+
        0016  DGLPB [OPPO]
        0019  DECchip 21142/43
-               1011 500b  DE500 Fast Ethernet
+               1011 500a  DE500A Fast Ethernet
+               1011 500b  DE500B Fast Ethernet
                1014 0001  10/100 EtherJet Cardbus
                1025 0315  ALN315 Fast Ethernet
+               1033 800c  PC-9821-CS01
+               1033 800d  PC-9821NR-B06
                108d 0016  Rapidfire 2327 10/100 Ethernet
+               108d 0017  GoCard 2250 Ethernet 10/100 Cardbus
                10b8 2005  SMC8032DT Extreme Ethernet 10/100
+               10b8 8034  SMC8034 Extreme Ethernet 10/100
                10ef 8169  Cardbus Fast Ethernet
                1109 2a00  ANA-6911A/TX Fast Ethernet
                1109 2b00  ANA-6911A/TXC Fast Ethernet
                1186 1100  DFE-500TX Fast Ethernet
                1186 1101  DFE-500TX Fast Ethernet
                1186 1102  DFE-500TX Fast Ethernet
+               1259 2800  AT-2800Tx Fast Ethernet
                1266 0004  Eagle Fast EtherMAX
                12af 0019  NetFlyer Cardbus Fast Ethernet
                1374 0001  Cardbus Ethernet Card 10/100
+               1374 0002  Cardbus Ethernet Card 10/100
+               1374 0007  Cardbus Ethernet Card 10/100
+               1374 0008  Cardbus Ethernet Card 10/100
                1395 0001  10/100 Ethernet CardBus PC Card
+               13d1 ab01  EtherFast 10/100 Cardbus (PCMPC200)
                8086 0001  EtherExpress PRO/100 Mobile CardBus 32
+       001a  Farallon PN9000SX
        0021  DECchip 21052
        0022  DECchip 21150
        0023  DECchip 21150
        0024  DECchip 21152
        0025  DECchip 21153
        0026  DECchip 21154
+       0034  56k Modem Cardbus
+               1374 0003  56k Modem Cardbus
        0045  DECchip 21553
        0046  DECchip 21554
+               0e11 4050  Integrated Smart Array
+               0e11 4051  Integrated Smart Array
+               0e11 4058  Integrated Smart Array
                103c 10c2  Hewlett-Packard NetRAID-4M
+               12d9 000a  VoIP PCI Gateway
                9005 0365  Adaptec 5400S
                9005 1364  Dell PowerEdge RAID Controller 2
                9005 1365  Dell PowerEdge RAID Controller 2
+               e4bf 1000  CC8-1-BLUES
        1065  StrongARM DC21285
-               1069 0020  DAC960P
+               1069 0020  DAC960P / DAC1164P
 1012  Micronics Computers Inc
 1013  Cirrus Logic
        0038  GD 7548
        00d0  GD 5462
        00d2  GD 5462 [Laguna I]
        00d4  GD 5464 [Laguna]
+       00d5  GD 5464 BD [Laguna]
        00d6  GD 5465 [Laguna]
+               13ce 8031  Barco Metheus 2 Megapixel, Dual Head
+               13cf 8031  Barco Metheus 2 Megapixel, Dual Head
        00e8  GD 5436U
        1100  CL 6729
-       1110  PD 6832
+       1110  PD 6832 PCMCIA/CardBus Ctrlr
        1112  PD 6834 PCMCIA/CardBus Ctrlr
        1113  PD 6833 PCMCIA/CardBus Ctrlr
        1200  GD 7542 [Nordic]
                1014 1010  CS4610 SoundFusion Audio Accelerator
        6003  CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
                1013 4280  Crystal SoundFusion PCI Audio Accelerator
+               1681 0050  Hercules Game Theater XP
+       6004  CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
        6005  Crystal CS4281 PCI Audio
                1013 4281  Crystal CS4281 PCI Audio
                10cf 10a8  Crystal CS4281 PCI Audio
        0017  CPU to PCI Bridge
        0018  TR Auto LANstreamer
        001b  GXT-150P
+       001c  Carrera
        001d  82G2675
        0020  MCA
        0022  IBM27-82351
        00b7  256-bit Graphics Rasterizer [Fire GL1]
                1902 00b8  Fire GL1
        00be  ATM 622MBPS Controller (1410be00)
+       00fc  CPC710 Dual Bridge and Memory Controller (PCI-64)
+       0105  CPC710 Dual Bridge and Memory Controller (PCI-32)
        0142  Yotta Video Compositor Input
                1014 0143  Yotta Input Controller (ytin)
        0144  Yotta Video Compositor Output
                1014 0145  Yotta Output Controller (ytout)
        0156  405GP PLB to PCI Bridge
+       01a7  PCI-X to PCI-X Bridge
        01bd  Netfinity ServeRAID controller
        01be  ServeRAID-4M
        01bf  ServeRAID-4L
        c24a  90C
 101e  American Megatrends Inc.
        1960  MegaRAID
+               101e 0471  MegaRAID 471 Enterprise 1600 RAID Controller
+               101e 0475  MegaRAID 475 Express 500 RAID Controller
+               101e 0493  MegaRAID 493 Elite 1600 RAID Controller
                1028 0471  PowerEdge RAID Controller 3/QC
+               1028 0475  PowerEdge RAID Controller 3/SC
                1028 0493  PowerEdge RAID Controller 3/DC
-       9010  MegaRAID
+               1028 0511  PowerEdge Cost Effective RAID Controller ATA100/4Ch
+       9010  MegaRAID 428 Ultra RAID Controller
        9030  EIDE Controller
        9031  EIDE Controller
        9032  EIDE & SCSI Controller
        9033  SCSI Controller
        9040  Multimedia card
-       9060  MegaRAID
+       9060  MegaRAID 434 Ultra GT RAID Controller
+       9063  MegaRAC
+               101e 0767  Dell Remote Assistant Card 2
 101f  PictureTel
 1020  Hitachi Computer Products
 1021  OKI Electric Industry Co. Ltd.
 1022  Advanced Micro Devices [AMD]
        2000  79c970 [PCnet LANCE]
+               1014 2000  NetFinity 10/100 Fast Ethernet
                103c 104c  Ethernet with LAN remote power Adapter
                103c 1064  Ethernet with LAN remote power Adapter
                103c 1065  Ethernet with LAN remote power Adapter
                103c 10ea  Ethernet with LAN remote power Adapter
                1113 1220  EN1220 10/100 Fast Ethernet
                1259 2450  AT-2450 10/100 Fast Ethernet
+               1259 2454  AT-2450v4 10Mb Ethernet Adapter
                1259 2700  AT-2700TX 10/100 Fast Ethernet
                1259 2701  AT-2700FX 100Mb Ethernet
        2001  79c978 [HomePNA]
+               1092 0a78  Multimedia Home Network Adapter
+               1668 0299  ActionLink Home Network Adapter
        2020  53c974 [PCscsi]
        2040  79c974
+       3000  ELanSC520 Microcontroller
        7006  AMD-751 [Irongate] System Controller
        7007  AMD-751 [Irongate] AGP Bridge
-       700e  AMD-760 [Irongate] System Controller
-       700f  AMD-760 [Irongate] AGP Bridge
+       700c  AMD-760 MP [IGD4-2P] System Controller
+       700d  AMD-760 MP [IGD4-2P] AGP Bridge
+       700e  AMD-760 [IGD4-1P] System Controller
+       700f  AMD-760 [IGD4-1P] AGP Bridge
        7400  AMD-755 [Cobra] ISA
        7401  AMD-755 [Cobra] IDE
        7403  AMD-755 [Cobra] ACPI
        7409  AMD-756 [Viper] IDE
        740b  AMD-756 [Viper] ACPI
        740c  AMD-756 [Viper] USB
-       7410  AMD-765 [Viper] ISA
-       7411  AMD-765 [Viper] IDE
-       7413  AMD-765 [Viper] ACPI
-       7414  AMD-765 [Viper] USB
-       7440  AMD-768 [??] ISA
-       7441  AMD-768 [??] IDE
-       7443  AMD-768 [??] ACPI
-       7448  AMD-768 [??] PCI
-       7449  AMD-768 [??] USB
+       7410  AMD-766 [ViperPlus] ISA
+       7411  AMD-766 [ViperPlus] IDE
+       7413  AMD-766 [ViperPlus] ACPI
+       7414  AMD-766 [ViperPlus] USB
+       7440  AMD-768 [Opus] ISA
+               1043 8044  A7M-D Mainboard
+       7441  AMD-768 [Opus] IDE
+       7443  AMD-768 [Opus] ACPI
+               1043 8044  A7M-D Mainboard
+       7445  AMD-768 [Opus] Audio
+       7448  AMD-768 [Opus] PCI
+       7449  AMD-768 [Opus] USB
+       7454  AMD-8151 System Controller
+       7455  AMD-8151 AGP Bridge
+       7460  AMD-8111 PCI
+       7461  AMD-8111 USB
+       7462  AMD-8111 Ethernet
+       7468  AMD-8111 LPC
+       7469  AMD-8111 IDE
+       746a  AMD-8111 SMBus 2.0
+       746b  AMD-8111 ACPI
+       746d  AMD-8111 AC97 Audio
+       756b  AMD-8111 ACPI
 1023  Trident Microsystems
        0194  82C194
        2000  4DWave DX
        8520  CyberBlade i1
                0e11 b16e  CyberBlade i1 AGP
                1023 8520  CyberBlade i1 AGP
+       8820  CyberBlade XPAi1
        9320  TGUI 9320
        9350  GUI Accelerator
        9360  Flat panel GUI Accelerator
        9470  TGUI 9470
        9520  Cyber 9520
        9525  Cyber 9525
+               10cf 1094  Lifebook C6155
        9540  Cyber 9540
-       9660  TGUI 9660/968x/968x
+       9660  TGUI 9660/938x/968x
        9680  TGUI 9680
        9682  TGUI 9682
        9683  TGUI 9683
        9685  ProVIDIA 9685
-       9750  3DIm`age 975
+       9750  3DImage 9750
                1014 9750  3DImage 9750
                1023 9750  3DImage 9750
        9753  TGUI 9753
        1621  M1621 Northbridge [Aladdin-Pro II]
        1631  M1631 Northbridge+3D Graphics [Aladdin TNT2]
        1641  M1641 Northbridge [Aladdin-Pro IV]
+       1647  M1647 [MaGiK1] PCI North Bridge
        3141  M3141
        3143  M3143
        3145  M3145
        3307  M3307 MPEG-I Video Controller
        3309  M3309 MPEG-II Video w/ Software Audio Decoder
        3321  M3321 MPEG-II Audio/Video Decoder
-       5212  ALI M4803
+       5212  M4803
        5215  ALI PCI EIDE Controller
        5217  M5217H
        5219  M5219
        5225  M5225
        5229  M5229
        5235  M5235
-       5237  ALI M5237 PCI USB Host Controller
+       5237  M5237 PCI USB Host Controller
        5240  EIDE Controller
        5241  PCMCIA Bridge
        5242  General Purpose Controller
        5243  PCI to PCI Bridge Controller
        5244  Floppy Disk Controller
-       5247  ALI M1541 PCI to PCI Bridge
-       5251  M5251 P1394 OHCI Controller
-       5427  ALI PCI to AGP Bridge
-       5451  ALI M5451 PCI AC-Link Controller Audio Device
-       5453  ALI M5453 PCI AC-Link Controller Modem Device
-       7101  ALI M7101 PCI PMU Power Management Controller
-               10b9 7101  ALI M7101 PCI PMU Power Management Controller
+       5247  M1541 PCI to PCI Bridge
+       5251  M5251 P1394 Controller
+       5427  PCI to AGP Bridge
+       5451  M5451 PCI AC-Link Controller Audio Device
+       5453  M5453 PCI AC-Link Controller Modem Device
+       7101  M7101 PCI PMU Power Management Controller
+               10b9 7101  M7101 PCI PMU Power Management Controller
 1028  Dell Computer Corporation
        0001  PowerEdge Expandable RAID Controller 2/Si
-       0002  PowerEdge Expandable RAID Controller 3/Di
+               1028 0001  PowerEdge Expandable RAID Controller 2/Si
+       0002  PowerEdge Expandable RAID Controller 3
+               1028 0002  PowerEdge Expandable RAID Controller 3/Di
+               1028 00d1  PowerEdge Expandable RAID Controller 3/Di
+               1028 00d9  PowerEdge Expandable RAID Controller 3/Di
        0003  PowerEdge Expandable RAID Controller 3/Si
+               1028 0003  PowerEdge Expandable RAID Controller 3/Si
        0004  PowerEdge Expandable RAID Controller 3/Si
+               1028 00d0  PowerEdge Expandable RAID Controller 3/Si
        0005  PowerEdge Expandable RAID Controller 3/Di
        0006  PowerEdge Expandable RAID Controller 3/Di
+       0007  Remote Assistant Card 3
        0008  PowerEdge Expandable RAID Controller 3/Di
-       000a  PowerEdge Expandable RAID Controller 3/Di
+       000a  PowerEdge Expandable RAID Controller 3
+               1027 0121  PowerEdge Expandable RAID Controller 3/Di
+               1028 0106  PowerEdge Expandable RAID Controller 3/Di
+               1028 011b  PowerEdge Expandable RAID Controller 3/Di
+       000c  Embedded Systems Management Device 4
+       000e  PowerEdge Expandable RAID Controller
+       000f  PowerEdge Expandable RAID Controller 4/Di
 1029  Siemens Nixdorf IS
 102a  LSI Logic
        0000  HYDRA
                102b ca6c  Millennium G250 AGP
                102b dbbc  Millennium G200 AGP
                102b dbc2  Millennium G200 MMS (Dual G200)
+               102b dbc3  G200 Multi-Monitor
                102b dbc8  Millennium G200 MMS (Dual G200)
+               102b dbd2  G200 Multi-Monitor
+               102b dbd3  G200 Multi-Monitor
+               102b dbd4  G200 Multi-Monitor
+               102b dbd5  G200 Multi-Monitor
+               102b dbd8  G200 Multi-Monitor
+               102b dbd9  G200 Multi-Monitor
                102b dbe2  Millennium G200 MMS (Quad G200)
+               102b dbe3  G200 Multi-Monitor
                102b dbe8  Millennium G200 MMS (Quad G200)
+               102b dbf2  G200 Multi-Monitor
+               102b dbf3  G200 Multi-Monitor
+               102b dbf4  G200 Multi-Monitor
+               102b dbf5  G200 Multi-Monitor
+               102b dbf8  G200 Multi-Monitor
+               102b dbf9  G200 Multi-Monitor
                102b f806  Mystique G200 Video AGP
                102b ff00  MGA-G200 AGP
                102b ff02  Mystique G200 AGP
                102b ff04  Marvel G200 AGP
                110a 0032  MGA-G200 AGP
        0525  MGA G400 AGP
-               0e11 b16f  Matrox MGA-G400 AGP
+               0e11 b16f  MGA-G400 AGP
                102b 0328  Millennium G400 16Mb SDRAM
                102b 0338  Millennium G400 16Mb SDRAM
                102b 0378  Millennium G400 32Mb SDRAM
                102b 0541  Millennium G450 Dual Head
                102b 0542  Millennium G450 Dual Head LX
-               102b 0641  Millennium G450 32Mb SDRAM
+               102b 0543  Millennium G450 Single Head LX
+               102b 0641  Millennium G450 32Mb SDRAM Dual Head
                102b 0642  Millennium G450 32Mb SDRAM Dual Head LX
+               102b 0643  Millennium G450 32Mb SDRAM Single Head LX
                102b 07c0  Millennium G450 Dual Head LE
-               102b 07c1  Millennium G450 SDR Dual Head
+               102b 07c1  Millennium G450 SDR Dual Head LE
                102b 0d41  Millennium G450 Dual Head PCI
                102b 0d42  Millennium G450 Dual Head LX PCI
                102b 0e00  Marvel G450 eTV
                102b 2159  Millennium G400 Dual Head 16Mb
                102b 2179  Millennium G400 MAX/Dual Head 32Mb
                102b 217d  Millennium G400 Dual Head Max
+               102b 23c0  Millennium G450
+               102b 23c1  Millennium G450
+               102b 23c2  Millennium G450 DVI
+               102b 23c3  Millennium G450 DVI
                102b 2f58  Millennium G400
                102b 2f78  Millennium G400
                102b 3693  Marvel G400 AGP
-               1705 0001  Millennium G450 32MB SGRAM
-               b16f 0e11  Matrox MGA-G400 AGP
+               102b 5dd0  4Sight II
+               102b 5f50  4Sight II
+               102b 5f51  4Sight II
+               102b 5f52  4Sight II
+               102b 9010  Millennium G400 Dual Head
+               1458 0400  GA-G400
+               1705 0001  Digital First Millennium G450 32MB SGRAM
+               1705 0002  Digital First Millennium G450 16MB SGRAM
+               1705 0003  Digital First Millennium G450 32MB
+               1705 0004  Digital First Millennium G450 16MB
+               b16f 0e11  MGA-G400 AGP
+       0527  MGA Parhelia AGP
+               102b 0840  Parhelia 128Mb
        0d10  MGA Ultima/Impression
        1000  MGA G100 [Productiva]
                102b ff01  Productiva G100
                110a 001e  MGA-G100 AGP
        2007  MGA Mistral
        2527  MGA G550 AGP
+               102b 0f83  Millennium G550
                102b 0f84  Millennium G550 Dual Head DDR 32Mb
+               102b 1e41  Millennium G550
        4536  VIA Framegrabber
        6573  Shark 10/100 Multiport SwitchNIC
 102c  Chips and Technologies
        00b8  F64310
        00c0  F69000 HiQVideo
+               102c 00c0  F69000 HiQVideo
        00d0  F65545
        00d8  F65545
        00dc  F65548
        00f0  F68554
        00f4  F68554 HiQVision
        00f5  F68555
+       0c30  F69030
 102d  Wyse Technology Inc.
        50dc  3328 Audio
 102e  Olivetti Advanced Technology
 102f  Toshiba America
        0009  r4x00
        0020  ATM Meteor 155
+               102f 00f8  ATM Meteor 155
 1030  TMC Research
 1031  Miro Computer Products AG
        5601  DC20 ASIC
        0029  PowerVR PCX1
        002a  PowerVR 3D
        0035  USB
+               1179 0001  USB
+               12ee 7000  Root Hub
        003e  NAPCCARD Cardbus Controller
        0046  PowerVR PCX2 [midas]
        005a  Vrc5074 [Nile 4]
        0074  56k Voice Modem
                1033 8014  RCV56ACF 56k Voice Modem
        009b  Vrc5476
+       00a6  VRC5477 AC97
+       00cd  IEEE 1394 [OrangeLink] Host Controller
+               12ee 8011  Root hub
+       00e0  USB 2.0
+               12ee 7001  Root hub
 1034  Framatome Connectors USA Inc.
 1035  Comp. & Comm. Research Lab
 1036  Future Domain Corp.
        0008  85C503/5513
        0009  ACPI
        0018  SiS85C503/5513 (LPC Bridge)
-       0200  5597/5598 VGA
+       0200  5597/5598/6326 VGA
                1039 0000  SiS5597 SVGA (Shared RAM)
        0204  82C204
        0205  SG86C205
+       0300  300/200
+               107d 2720  Leadtek WinFast VR300
        0406  85C501/2
        0496  85C496
        0530  530 Host
        0601  85C601
        0620  620 Host
        0630  630 Host
+       0633  633 Host
+       0635  635 Host
+       0645  645 Host
+       0646  645DX Host
+       0650  650 Host
        0730  730 Host
+       0733  733 Host
        0735  735 Host
+       0740  740 Host
+       0745  745 Host
        0900  SiS900 10/100 Ethernet
                1039 0900  SiS900 10/100 Ethernet Adapter
+       0961  SiS961 [MuTIOL Media IO]
        3602  83C602
        5107  5107
        5300  SiS540 PCI Display Adapter
        6300  SiS630 GUI Accelerator+3D
        6306  6306 3D-AGP
                1039 6306  SiS530,620 GUI Accelerator+3D
-       6326  86C326
+       6326  86C326 5598/6326
                1039 6326  SiS6326 GUI Accelerator
                1092 0a50  SpeedStar A50
                1092 0a70  SpeedStar A70
                1092 4920  SpeedStar A70
                1569 6326  SiS6326 GUI Accelerator
        7001  7001
-       7007  OHCI Compliant FireWire Controller
+       7007  FireWire Controller
        7012  SiS7012 PCI Audio Accelerator
+       7013  56k Winmodem (Smart Link HAMR5600 compatible)
        7016  SiS7016 10/100 Ethernet Adapter
                1039 7016  SiS7016 10/100 Ethernet Adapter
        7018  SiS PCI Audio Accelerator
 103b  Tatung Co. of America
 103c  Hewlett-Packard Company
        1005  A4977A Visualize EG
-       1030  J2585A
-       1031  J2585B
+       1006  Visualize FX6
+       1008  Visualize FX4
+       100a  Visualize FX2
+       1028  Tach TL Fibre Channel Host Adapter
+       1029  Tach XL2 Fibre Channel Host Adapter
+               107e 000f  Interphase 5560 Fibre Channel Adapter
+               9004 9210  1Gb/2Gb Family Fibre Channel Controller
+               9004 9211  1Gb/2Gb Family Fibre Channel Controller
+       102a  Tach TS Fibre Channel Host Adapter
+               107e 000e  Interphase 5540/5541 Fibre Channel Adapter
+               9004 9110  1Gb/2Gb Family Fibre Channel Controller
+               9004 9111  1Gb/2Gb Family Fibre Channel Controller
+       1030  J2585A DeskDirect 10/100VG NIC
+       1031  J2585B HP 10/100VG PCI LAN Adapter
                103c 1040  J2973A DeskDirect 10BaseT NIC
                103c 1041  J2585B DeskDirect 10/100VG NIC
                103c 1042  J2970A DeskDirect 10BaseT/2 NIC
        1040  J2973A DeskDirect 10BaseT NIC
        1041  J2585B DeskDirect 10/100 NIC
        1042  J2970A DeskDirect 10BaseT/2 NIC
+       1048  Diva Serial [GSP] Multiport UART
+               103c 1049  Tosca Console
+               103c 104a  Tosca Secondary
+               103c 104b  Maestro SP2
+               103c 1223  Halfdome Console
+               103c 1226  Keystone SP2
+               103c 1227  Powerbar SP2
+               103c 1282  Everest SP2
        1064  79C970 PCnet Ethernet Controller
+       108b  Visualize FXe
        10c1  NetServer Smart IRQ Router
        10ed  TopTools Remote Control
        1200  82557B 10/100 NIC
        121a  NetServer SMIC Controller
        121b  NetServer Legacy COM Port Decoder
        121c  NetServer PCI COM Port Decoder
-       2910  E2910A
-       2925  E2925A
+       1229  zx1 System Bus Adapter
+       122a  zx1 I/O Controller
+       122e  zx1 Local Bus Adapter
+       1290  Auxiliary Diva Serial Port
+       2910  E2910A PCIBus Exerciser
+       2925  E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
 103e  Solliday Engineering
 103f  Synopsys/Logic Modeling Group
 1040  Accelgraphics Inc.
        3010  Samurai_1
        3020  Samurai_IDE
 1043  Asustek Computer, Inc.
+       0675  ISDNLink P-IN100-ST-D
+       4057  V8200 GeForce 3
 1044  Distributed Processing Technology
        1012  Domino RAID Engine
        a400  SmartCache/Raid I-IV Controller
        a500  PCI Bridge
        a501  SmartRAID V Controller
+               1044 c001  PM1554U2 Ultra2 Single Channel
+               1044 c002  PM1654U2 Ultra2 Single Channel
+               1044 c003  PM1564U3 Ultra3 Single Channel
+               1044 c004  PM1564U3 Ultra3 Dual Channel
+               1044 c005  PM1554U2 Ultra2 Single Channel (NON ACPI)
+               1044 c00a  PM2554U2 Ultra2 Single Channel
+               1044 c00b  PM2654U2 Ultra2 Single Channel
+               1044 c00c  PM2664U3 Ultra3 Single Channel
+               1044 c00d  PM2664U3 Ultra3 Dual Channel
+               1044 c00e  PM2554U2 Ultra2 Single Channel (NON ACPI)
+               1044 c00f  PM2654U2 Ultra2 Single Channel (NON ACPI)
+               1044 c014  PM3754U2 Ultra2 Single Channel (NON ACPI)
+               1044 c015  PM3755U2B Ultra2 Single Channel (NON ACPI)
+               1044 c016  PM3755F Fibre Channel (NON ACPI)
+               1044 c01e  PM3757U2 Ultra2 Single Channel
+               1044 c01f  PM3757U2 Ultra2 Dual Channel
+               1044 c020  PM3767U3 Ultra3 Dual Channel
+               1044 c021  PM3767U3 Ultra3 Quad Channel
+               1044 c028  PM2865U3 Ultra3 Single Channel
+               1044 c029  PM2865U3 Ultra3 Dual Channel
+               1044 c02a  PM2865F Fibre Channel
+               1044 c03c  2000S Ultra3 Single Channel
+               1044 c03d  2000S Ultra3 Dual Channel
+               1044 c03e  2000F Fibre Channel
+               1044 c046  3000S Ultra3 Single Channel
+               1044 c047  3000S Ultra3 Dual Channel
+               1044 c048  3000F Fibre Channel
+               1044 c050  5000S Ultra3 Single Channel
+               1044 c051  5000S Ultra3 Dual Channel
+               1044 c052  5000F Fibre Channel
+               1044 c05a  2400A UDMA Four Channel
+               1044 c05b  2400A UDMA Four Channel DAC
+               1044 c064  3010S Ultra3 Dual Channel
+               1044 c065  3010S Ultra3 Four Channel
+               1044 c066  3010S Fibre Channel
+       a511  SmartRAID V Controller
 1045  OPTi Inc.
        a0f8  82C750 [Vendetta] USB Controller
        c101  92C264
        c567  82C750 [Vendetta], device 0
        c568  82C750 [Vendetta], device 1
        c569  82C579 [Viper XPress+ Chipset]
-       c621  82C621
-       c700  82C700
+       c621  82C621 [Viper-M/N+]
+       c700  82C700 [FireStar]
        c701  82C701 [FireStar Plus]
        c814  82C814 [Firebridge 1]
        c822  82C822
        c895  82C895
        c935  EV1935 ECTIVA MachOne PCI Audio
        d568  82C825 [Firebridge 2]
+       d721  IDE [FireStar]
 1046  IPC Corporation, Ltd.
 1047  Genoa Systems Corp
 1048  Elsa AG
+       0d22  Quadro4 900XGL [ELSA GLoria4 900XGL]
        1000  QuickStep 1000
        3000  QuickStep 3000
 1049  Fountain Technologies, Inc.
 104a  SGS Thomson Microelectronics
        0008  STG 2000X
        0009  STG 1764X
+       0981  DEC-Tulip compatible 10/100 Ethernet
        1746  STG 1764X
+       2774  DEC-Tulip compatible 10/100 Ethernet
        3520  MPEG-II decoder card
 104b  BusLogic
        0140  BT-946C (old) [multimaster  01]
        1000  Eagle i/f AS
        3d04  TVP4010 [Permedia]
        3d07  TVP4020 [Permedia 2]
+               1011 4d10  Comet
+               1040 000f  AccelStar II
+               1040 0011  AccelStar II
+               1048 0a31  WINNER 2000
+               1048 0a32  GLoria Synergy
+               1048 0a35  GLoria Synergy
+               107d 2633  WinFast 3D L2300
                1092 0127  FIRE GL 1000 PRO
                1092 0136  FIRE GL 1000 PRO
                1092 0141  FIRE GL 1000 PRO
                1092 0156  FIRE GL 1000 PRO
                1092 0157  FIRE GL 1000 PRO
                1097 3d01  Jeronimo Pro
+               1102 100f  Graphics Blaster Extreme
                3d3d 0100  Reference Permedia 2 3D
        8000  PCILynx/PCILynx2 IEEE 1394 Link Layer Controller
                e4bf 1010  CF1-1-SNARE
                e4bf 1020  CF1-2-SNARE
-       8009  OHCI Compliant FireWire Controller
-       8019  TSB12LV23 OHCI Compliant IEEE-1394 Controller
+       8009  FireWire Controller
+               104d 8032  8032 OHCI i.LINK (IEEE 1394) Controller
+       8017  PCI4410 FireWire Controller
+       8019  TSB12LV23 IEEE-1394 Controller
                11bd 000a  Studio DV500-1394
                11bd 000e  Studio DV
                e4bf 1010  CF2-1-CYMBAL
+       8020  TSB12LV26 IEEE-1394 Controller (Link)
+       8021  TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)
+               104d 80df  Vaio PCG-FX403
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       8022  TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link)
+       8023  TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
+       8024  TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
+       8026  TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
+       8027  PCI4451 IEEE-1394 Controller
+               1028 00e6  PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)
        a001  TDC1570
        a100  TDC1561
+       a102  TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f
        ac10  PCI1050
        ac11  PCI1053
        ac12  PCI1130
        ac1e  PCI1211
        ac1f  PCI1251B
        ac20  TI 2030
+       ac21  PCI2031
+       ac22  PCI2032 PCI Docking Bridge
+       ac23  PCI2250 PCI-to-PCI Bridge
+       ac28  PCI2050 PCI-to-PCI Bridge
        ac30  PCI1260 PC card Cardbus Controller
        ac40  PCI4450 PC card Cardbus Controller
        ac41  PCI4410 PC card Cardbus Controller
        ac42  PCI4451 PC card Cardbus Controller
+               1028 00e6  PCI4451 PC card CardBus Controller (Dell Inspiron 8100)
        ac50  PCI1410 PC card Cardbus Controller
        ac51  PCI1420
+               1014 023b  ThinkPad T23 (2647-4MG)
+               10cf 1095  Lifebook C6155
+               e4bf 1000  CP2-2-HIPHOP
        ac52  PCI1451 PC card Cardbus Controller
        ac53  PCI1421 PC card Cardbus Controller
+       ac55  PCI1250 PC card Cardbus Controller
+       ac60  PCI2040 PCI to DSP Bridge Controller
        fe00  FireWire Host Controller
        fe03  12C01A FireWire Host Controller
 104d  Sony Corporation
 1052  ?Young Micro Systems
 1053  Young Micro Systems
 1054  Hitachi, Ltd
-1055  EFAR Microsystems
-       9130  EIDE Controller
-       9460  PCI to ISA Bridge
-       9462  USB Universal Host Controller [OHCI]
-       9463  Power Management Controller [Bridge]
+1055  Efar Microsystems
+       9130  SLC90E66 [Victory66] IDE
+       9460  SLC90E66 [Victory66] ISA
+       9462  SLC90E66 [Victory66] USB
+       9463  SLC90E66 [Victory66] ACPI
 1056  ICL
 # Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this.
 1057  Motorola
        0001  MPC105 [Eagle]
        0002  MPC106 [Grackle]
+       0003  MPC8240 [Kahlua]
        0100  MC145575 [HFC-PCI]
        0431  KTI829c 100VG
        1801  Audio I/O Controller (MIDI)
                ecc0 0030  Layla
+       18c0  MPC8265A/MPC8266
        4801  Raven
        4802  Falcon
        4803  Hawk
                14c8 0302  SM56 PCI Fax Modem
                1668 0300  SM56 PCI Speakerphone Modem
                1668 0302  SM56 PCI Fax Modem
+       6400  MPC190 Security Processor (S1 family, encryption)
 1058  Electronics & Telecommunications RSH
 1059  Teknor Industrial Computers Inc
 105a  Promise Technology, Inc.
        0d30  20265
+               105a 4d33  Ultra100
+       0d38  20263
+               105a 4d39  Fasttrak66
+       1275  20275
        4d30  20267
+               105a 4d33  Ultra100
+               105a 4d39  Fasttrak100
        4d33  20246
+               105a 4d33  20246 IDE Controller
        4d38  20262
+               105a 4d30  Ultra Device on SuperTrak
+               105a 4d33  Ultra66
+               105a 4d39  Fasttrak66
        4d68  20268
-       6268  20268R
+               105a 4d68  Ultra100TX2
        4d69  20269
+       5275  PDC20276 IDE
+               105a 0275  SuperTrak SX6000 IDE
        5300  DC5300
+       6268  20268R
+       6269  PDC20271
+               105a 6269  Fasttrack tx2
+       7275  PDC20277
 105b  Foxconn International, Inc.
 105c  Wipro Infotech Limited
 105d  Number 9 Computer Company
                105d 0009  Imagine 128 series 2e 4Mb DRAM
                105d 000a  Imagine 128 series 2 8Mb VRAM
                105d 000b  Imagine 128 series 2 8Mb H-VRAM
+               11a4 000a  Barco Metheus 5 Megapixel
+               13cc 0000  Barco Metheus 5 Megapixel
+               13cc 0004  Barco Metheus 5 Megapixel
+               13cc 0005  Barco Metheus 5 Megapixel
+               13cc 0006  Barco Metheus 5 Megapixel
+               13cc 0008  Barco Metheus 5 Megapixel
+               13cc 0009  Barco Metheus 5 Megapixel
+               13cc 000a  Barco Metheus 5 Megapixel
+               13cc 000c  Barco Metheus 5 Megapixel
        493d  Imagine 128 T2R [Ticket to Ride]
+               11a4 000a  Barco Metheus 5 Megapixel, Dual Head
+               11a4 000b  Barco Metheus 5 Megapixel, Dual Head
+               13cc 0002  Barco Metheus 4 Megapixel, Dual Head
+               13cc 0003  Barco Metheus 5 Megapixel, Dual Head
+               13cc 0007  Barco Metheus 5 Megapixel, Dual Head
+               13cc 0008  Barco Metheus 5 Megapixel, Dual Head
+               13cc 0009  Barco Metheus 5 Megapixel, Dual Head
+               13cc 000a  Barco Metheus 5 Megapixel, Dual Head
        5348  Revolution 4
 105e  Vtech Computers Ltd
 105f  Infotronic America Inc
 1065  Texas Microsystems
 1066  PicoPower Technology
        0000  PT80C826
-       0001  PT86C52x [Vesuvius]
-       0002  PT80C524 [Nile]
+       0001  PT86C521 [Vesuvius v1] Host Bridge
+       0002  PT86C523 [Vesuvius v3] PCI-ISA Bridge Master
+       0003  PT86C524 [Nile] PCI-to-PCI Bridge
+       0004  PT86C525 [Nile-II] PCI-to-PCI Bridge
        0005  National PC87550 System Controller
-       8002  PT80C524 [Nile]
+       8002  PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave
 1067  Mitsubishi Electric
        1002  VG500 [VolumePro Volume Rendering Accelerator]
 1068  Diversified Technology
        0001  DAC960P
        0002  DAC960PD
        0010  DAC960PX
-       ba55  eXtremeRAID support Device
+       0050  AcceleRAID 352/170/160 support Device
+       ba55  eXtremeRAID 1100 support Device
+       ba56  eXtremeRAID 2000/3000 support Device
 106a  Aten Research Inc
 106b  Apple Computer Inc.
        0001  Bandit PowerPC host bridge
        0017  Paddington Mac I/O
        0018  UniNorth FireWire
        0019  KeyLargo USB
-       001e  UniNorth PCI
+       001e  UniNorth Internal PCI
        001f  UniNorth PCI
        0020  UniNorth AGP
-       0021  UniNorth GMAC
+       0021  UniNorth GMAC (Sun GEM)
        0022  KeyLargo Mac I/O
+       0024  UniNorth/Pangea GMAC (Sun GEM)
+       0025  KeyLargo/Pangea Mac I/O
+       0026  KeyLargo/Pangea USB
+       0027  UniNorth/Pangea AGP
+       0028  UniNorth/Pangea PCI
+       0029  UniNorth/Pangea Internal PCI
+       002d  UniNorth 1.5 AGP
+       002e  UniNorth 1.5 PCI
+       002f  UniNorth 1.5 Internal PCI
+       0030  UniNorth/Pangea FireWire
 106c  Hyundai Electronics America
        8801  Dual Pentium ISA/PCI Motherboard
        8802  PowerPC ISA/PCI Motherboard
 1075  Advanced Integrations Research
 1076  Chaintech Computer Co. Ltd
 1077  QLogic Corp.
-       1016  QLA10160
-       1020  ISP1020
-       1022  ISP1022
-       1080  QLA1080
-       1216  QLA12160
+       1016  ISP10160 Single Channel Ultra3 SCSI Processor
+       1020  ISP1020 Fast-wide SCSI
+       1022  ISP1022 Fast-wide SCSI
+       1080  ISP1080 SCSI Host Adapter
+       1216  ISP12160 Dual Channel Ultra3 SCSI Processor
                101e 8471  QLA12160 on AMI MegaRAID
                101e 8493  QLA12160 on AMI MegaRAID
-       1240  QLA1240
-       1280  QLA1280
-       2020  ISP2020A
-       2100  QLA2100
+       1240  ISP1240 SCSI Host Adapter
+       1280  ISP1280
+       2020  ISP2020A Fast!SCSI Basic Adapter
+       2100  QLA2100 64-bit Fibre Channel Adapter
+               1077 0001  QLA2100 64-bit Fibre Channel Adapter
        2200  QLA2200
-       2300  QLA2300
+       2300  QLA2300 64-bit FC-AL Adapter
+       2312  QLA2312 Fibre Channel Adapter
 1078  Cyrix Corporation
        0000  5510 [Grappa]
        0001  PCI Master
        0102  5530 IDE [Kahlua]
        0103  5530 Audio [Kahlua]
        0104  5530 Video [Kahlua]
+       0400  ZFMicro PCI Bridge
+       0401  ZFMicro Chipset SMI
+       0402  ZFMicro Chipset IDE
+       0403  ZFMicro Expansion Bus
 1079  I-Bus
 107a  NetWorth
 107b  Gateway 2000
 107d  LeadTek Research Inc.
        0000  P86C850
 107e  Interphase Corporation
-       0001  ATM Interface Card
+       0001  5515 ATM Adapter [Flipper]
        0002  100 VG AnyLan Controller
-       0008  155 Mbit ATM Controller
+       0004  5526 Fibre Channel Host Adapter
+       0005  x526 Fibre Channel Host Adapter
+       0008  5525/5575 ATM Adapter (155 Mbit) [Atlantic]
+       9003  5535-4P-BRI-ST
+       9007  5535-4P-BRI-U
+       9008  5535-1P-SR
+       900c  5535-1P-SR-ST
+       900e  5535-1P-SR-U
+       9011  5535-1P-PRI
+       9013  5535-2P-PRI
+       9023  5536-4P-BRI-ST
+       9027  5536-4P-BRI-U
+       9031  5536-1P-PRI
+       9033  5536-2P-PRI
 107f  Data Technology Corporation
        0802  SL82C105
 1080  Contaq Microsystems
 1087  Cache Computer
 1088  Microcomputer Systems (M) Son
 1089  Data General Corporation
-108a  Bit3 Computer Corp.
+108a  SBS Technologies (formerly Bit3 Computer Corp.)
        0001  VME Bridge Model 617
        0010  VME Bridge Model 618
+       0040  dataBLIZZARD
        3000  VME Bridge Model 2706
 108c  Oakleigh Systems Inc.
 108d  Olicom
        00a8  Speedstar 64
        0550  Viper V550
        08d4  Supra 2260 Modem
+       094c  SupraExpress 56i Pro
        1092  Viper V330
        6120  Maximum DVD
        8810  Stealth SE
        0647  PCI0647
        0648  PCI0648
        0649  PCI0649
+               0e11 005d  Integrated Ultra ATA-100 Dual Channel Controller
+               0e11 007e  Integrated Ultra ATA-100 IDE RAID Controller
+               101e 0649  AMI MegaRAID IDE 100 Controller
        0650  PBC0650A
        0670  USB0670
+               1095 0670  USB0670
        0673  USB0673
        0680  PCI0680
 1096  Alacron
 109c  Megachips Corporation
 109d  Zida Technologies Ltd.
 109e  Brooktree Corporation
-       0350  Bt848 TV with DMA push
+       0350  Bt848 Video Capture
        0351  Bt849A Video capture
+       0369  Bt878 Video Capture
+               1002 0001  TV-Wonder
+               1002 0003  TV-Wonder/VE
        036c  Bt879(??) Video Capture
                13e9 0070  Win/TV (Video Section)
-       036e  Bt878
+       036e  Bt878 Video Capture
                0070 13eb  WinTV/GO
+               0070 ff01  Viewcast Osprey 200
+               11bd 001c  PCTV Sat (DBC receiver)
                127a 0001  Bt878 Mediastream Controller NTSC
                127a 0002  Bt878 Mediastream Controller PAL BG
                127a 0003  Bt878a Mediastream Controller PAL BG
                127a 0048  Bt878/832 Mediastream Controller
                144f 3000  MagicTView CPH060 - Video
+               1461 0004  AVerTV WDM Video Capture
                14f1 0001  Bt878 Mediastream Controller NTSC
                14f1 0002  Bt878 Mediastream Controller PAL BG
                14f1 0003  Bt878a Mediastream Controller PAL BG
                1851 1850  FlyVideo'98 - Video
                1851 1851  FlyVideo II
                1852 1852  FlyVideo'98 - Video (with FM Tuner)
-       036f  Bt879
+       036f  Bt879 Video Capture
                127a 0044  Bt879 Video Capture NTSC
                127a 0122  Bt879 Video Capture PAL I
                127a 0144  Bt879 Video Capture NTSC
                1851 1850  FlyVideo'98
                1851 1851  FlyVideo'98 EZ - video
                1852 1852  FlyVideo'98 (with FM Tuner)
-       0878  Bt878
+       0878  Bt878 Audio Capture
                0070 13eb  WinTV/GO
+               0070 ff01  Viewcast Osprey 200
+               1002 0001  TV-Wonder
+               1002 0003  TV-Wonder/VE
+               11bd 001c  PCTV Sat (DBC receiver)
                127a 0001  Bt878 Video Capture (Audio Section)
                127a 0002  Bt878 Video Capture (Audio Section)
                127a 0003  Bt878 Video Capture (Audio Section)
                127a 0048  Bt878 Video Capture (Audio Section)
                13e9 0070  Win/TV (Audio Section)
                144f 3000  MagicTView CPH060 - Audio
+               1461 0004  AVerTV WDM Audio Capture
                14f1 0001  Bt878 Video Capture (Audio Section)
                14f1 0002  Bt878 Video Capture (Audio Section)
                14f1 0003  Bt878 Video Capture (Audio Section)
                14f1 0048  Bt878 Video Capture (Audio Section)
-       0879  Bt879 Video Capture (Audio Section)
+       0879  Bt879 Audio Capture
                127a 0044  Bt879 Video Capture (Audio Section)
                127a 0122  Bt879 Video Capture (Audio Section)
                127a 0144  Bt879 Video Capture (Audio Section)
                14f1 1522  Bt879 Video Capture (Audio Section)
                14f1 1622  Bt879 Video Capture (Audio Section)
                14f1 1722  Bt879 Video Capture (Audio Section)
-       0880  Bt880 Video Capture (Audio Section)
+       0880  Bt880 Audio Capture
        2115  BtV 2115 Mediastream controller
        2125  BtV 2125 Mediastream controller
        2164  BtV 2164
        0001  i960 PCI bus interface
        1076  VScom 800 8 port serial adaptor
        1077  VScom 400 4 port serial adaptor
+       1078  VScom 210 2 port serial and 1 port parallel adaptor
+       1103  VScom 200 2 port serial adaptor
+       1146  VScom 010 1 port parallel adaptor
+       1147  VScom 020 2 port parallel adaptor
+       2724  Thales PCSM Security Card
+       9030  PCI <-> IOBus Bridge Hot Swap
+               15ed 1002  MCCS 8-port Serial Hot Swap
+               15ed 1003  MCCS 16-port Serial Hot Swap
        9036  9036
        9050  PCI <-> IOBus Bridge
                10b5 2273  SH-ARC SoHard ARCnet card
+               1522 0001  RockForce 4 Port V.90 Data/Fax/Voice Modem
+               1522 0002  RockForce 2 Port V.90 Data/Fax/Voice Modem
+               1522 0003  RockForce 6 Port V.90 Data/Fax/Voice Modem
+               1522 0004  RockForce 8 Port V.90 Data/Fax/Voice Modem
+               1522 0010  RockForce2000 4 Port V.90 Data/Fax/Voice Modem
+               1522 0020  RockForce2000 2 Port V.90 Data/Fax/Voice Modem
+               15ed 1000  Macrolink MCCS 8-port Serial
+               15ed 1001  Macrolink MCCS 16-port Serial
+               15ed 1002  Macrolink MCCS 8-port Serial Hot Swap
+               15ed 1003  Macrolink MCCS 16-port Serial Hot Swap
+               d531 c002  PCIntelliCAN 2xSJA1000 CAN bus
                d84d 4006  EX-4006 1P
                d84d 4008  EX-4008 1P EPP/ECP
                d84d 4014  EX-4014 2P
                d84d 4065  EX-4065 8S(16C550) RS-232
                d84d 4068  EX-4068 8S(16C650) RS-232
                d84d 4078  EX-4078 2S(16C552) RS-232+1P
+       9054  PCI <-> IOBus Bridge
+               10b5 2455  Wessex Techology PHIL-PCI
        9060  9060
        906d  9060SD
                125c 0640  Aries 16000P
        906e  9060ES
        9080  9080
                10b5 9080  9080 [real subsystem ID not set]
+               129d 0002  Aculab PCI Prosidy card
        a001  GTEK Jetport II 2 port serial adaptor
        c001  GTEK Cyclone 16/32 port serial adaptor
 10b6  Madge Networks
        000a  Smart 100/16/4 PCI Ringnode
                10b6 000a  Smart 100/16/4 PCI Ringnode
        000b  16/4 CardBus Adapter Mk2
+               10b6 0008  16/4 CardBus Adapter Mk2
                10b6 000b  16/4 Cardbus Adapter Mk2
-       1000  Collage 25 ATM Adapter
+       000c  RapidFire 3140V2 16/4 TR Adapter
+               10b6 000c  RapidFire 3140V2 16/4 TR Adapter
+       1000  Collage 25/155 ATM Client Adapter
        1001  Collage 155 ATM Server Adapter
 10b7  3Com Corporation
-       0001  3c985 1000BaseSX
-       3390  Token Link Velocity
+       0001  3c985 1000BaseSX (SX/TX)
+       1006  MINI PCI type 3B Data Fax Modem
+       1007  Mini PCI 56k Winmodem
+               10b7 615c  Mini PCI 56K Modem
+       3390  3c339 TokenLink Velocity
        3590  3c359 TokenLink Velocity XL
-               10b7 3590  TokenLink Velocity XL Adapter
+               10b7 3590  TokenLink Velocity XL Adapter (3C359/359B)
        4500  3c450 Cyclone/unknown
        5055  3c555 Laptop Hurricane
        5057  3c575 [Megahertz] 10/100 LAN CardBus
        5157  3c575 [Megahertz] 10/100 LAN CardBus
                10b7 5b57  3C575 Megahertz 10/100 LAN Cardbus PC Card
        5257  3CCFE575CT Cyclone CardBus
+               10b7 5c57  FE575C-3Com 10/100 LAN CardBus-Fast Ethernet
        5900  3c590 10BaseT [Vortex]
        5920  3c592 EISA 10mbps Demon/Vortex
        5950  3c595 100BaseTX [Vortex]
                10b7 5b57  3C575 Megahertz 10/100 LAN Cardbus PC Card
        6055  3c556 Hurricane CardBus
        6056  3c556B Hurricane CardBus
+               10b7 6556  10/100 Mini PCI Ethernet Adapter
        6560  3CCFE656 Cyclone CardBus
+               10b7 656a  3CCFEM656 10/100 LAN+56K Modem CardBus
+       6561  3CCFEM656 10/100 LAN+56K Modem CardBus
+               10b7 656b  3CCFEM656 10/100 LAN+56K Modem CardBus
        6562  3CCFEM656 [id 6562] Cyclone CardBus
+               10b7 656b  3CCFEM656B 10/100 LAN+56K Modem CardBus
+       6563  3CCFEM656B 10/100 LAN+56K Modem CardBus
+               10b7 656b  3CCFEM656 10/100 LAN+56K Modem CardBus
        6564  3CCFEM656 [id 6564] Cyclone CardBus
        7646  3cSOHO100-TX Hurricane
+       7940  3c803 FDDILink UTP Controller
+       7980  3c804 FDDILink SAS Controller
+       7990  3c805 FDDILink DAS Controller
        8811  Token ring
        9000  3c900 10BaseT [Boomerang]
        9001  3c900 Combo [Boomerang]
        9006  3c900B-TPC [Etherlink XL TPC]
        900a  3c900B-FL [Etherlink XL FL]
        9050  3c905 100BaseTX [Boomerang]
-       9051  3c905 100BaseT4
+       9051  3c905 100BaseT4 [Boomerang]
        9055  3c905B 100BaseTX [Cyclone]
                1028 0080  3C905B Fast Etherlink XL 10/100
                1028 0081  3C905B Fast Etherlink XL 10/100
                1028 0098  3C905B Fast Etherlink XL 10/100
                1028 0099  3C905B Fast Etherlink XL 10/100
                10b7 9055  3C905B Fast Etherlink XL 10/100
-       9056  3c905B-T4
+       9056  3c905B-T4 [Fast EtherLink XL 10/100]
        9058  3c905B-Combo [Deluxe Etherlink XL 10/100]
        905a  3c905B-FX [Fast Etherlink XL FX 10/100]
-       9200  3c905C-TX [Fast Etherlink]
+       9200  3c905C-TX/TX-M [Tornado]
+               1028 0095  Integrated 3C905C-TX Fast Etherlink for PC Management NIC
                10b7 1000  3C905C-TX Fast Etherlink for PC Management NIC
+               10b7 7000  10/100 Mini PCI Ethernet Adapter
        9800  3c980-TX [Fast Etherlink XL Server Adapter]
                10b7 9800  3c980-TX Fast Etherlink XL Server Adapter
        9805  3c980-TX 10/100baseTX NIC [Python-T]
+               10b7 1201  3c982-TXM 10/100baseTX Dual Port A [Hydra]
+               10b7 1202  3c982-TXM 10/100baseTX Dual Port B [Hydra]
                10b7 9805  3c980 10/100baseTX NIC [Python-T]
+       9900  3C990-TX Typhoon
+       9902  3CR990-TX-95 56-bit Typhoon Client
+       9903  3CR990-TX-97 168-bit Typhoon Client
+       9904  3C990B-TX-M/3C990BSVR [Typhoon2]
+       9905  3CR990-FX-95/97/95 [Typhon Fiber]
+       9908  3CR990SVR95 56-bit Typhoon Server
+       9909  3CR990SVR97 Typhoon Server
+       990b  3C990SVR [Typhoon Server]
 10b8  Standard Microsystems Corp [SMC]
        0005  83C170QF
-               1055 e000  LANEPIC
-               1055 e002  LANEPIC
+               1055 e000  LANEPIC 10/100 [EVB171Q-PCI]
+               1055 e002  LANEPIC 10/100 [EVB171G-PCI]
                10b8 a011  EtherPower II 10/100
                10b8 a014  EtherPower II 10/100
                10b8 a015  EtherPower II 10/100
        1543  M1543
        1621  M1621
        1631  ALI M1631 PCI North Bridge Aladdin Pro III
+       1632  M1632M Northbridge+Trident
        1641  ALI M1641 PCI North Bridge Aladdin Pro IV
+       1644  M1644/M1644T Northbridge+Trident
+       1646  M1646 Northbridge+Trident
+       1647  M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]
+       1651  M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]
+       1671  M1671 Northbridge [Aladdin-P4]
        3141  M3141
        3143  M3143
        3145  M3145
        5219  M5219
        5225  M5225
        5229  M5229 IDE
+               1043 8053  A7A266 Motherboard IDE
        5235  M5225
-       5237  M5237 USB
-       5243  M5243
-       5247  M5247
-       5451  M5451 PCI South Bridge Audio
+       5237  USB 1.1 Controller
+       5239  USB 2.0 Controller
+       5243  M1541 PCI to AGP Controller
+       5247  PCI to AGP Controller
+       5251  M5251 P1394 OHCI 1.0 Controller
+       5253  M5253 P1394 OHCI 1.1 Controller
+       5261  M5261 Ethernet Controller
+       5451  M5451 PCI AC-Link Controller Audio Device
+       5453  M5453 PCI AC-Link Controller Modem Device
+       5455  M5455 PCI AC-Link Controller Audio Device
+       5457  M5457 AC-Link Modem Interface Controller
+       5471  M5471 Memory Stick Controller
+       5473  M5473 SD-MMC Controller
        7101  M7101 PMU
                10b9 7101  ALI M7101 Power Management Controller
 10ba  Mitsubishi Electric Corp.
                110a 8005  MagicMedia 256AV Audio Device
                14c0 0004  MagicMedia 256AV Audio Device
        8006  NM2360 [MagicMedia 256ZX Audio]
+       8016  NM2360 [MagicMedia 256ZX Audio]
 10c9  Dataexpert Corporation
 10ca  Fujitsu Microelectr., Inc.
 10cb  Omron Corporation
 10d9  Macronix, Inc. [MXIC]
        0512  MX98713
        0531  MX987x5
+               1186 1200  DFE-540TX ProFAST 10/100 Adapter
        8625  MX86250
        8888  MX86200
 10da  Compaq IPG-Austin
        10dc  ATT2C15-3 FPGA
 10dd  Evans & Sutherland
 10de  nVidia Corporation
-       0008  EDGE 3D [NV1]
-       0009  EDGE 3D [NV1]
-       0010  Mutara V08 [NV2]
-       0020  Riva TnT [NV04]
+       0008  NV1 [EDGE 3D]
+       0009  NV1 [EDGE 3D]
+       0010  NV2 [Mutara V08]
+       0020  NV4 [Riva TnT]
                1043 0200  V3400 TNT
                1048 0c18  Erazor II SGRAM
+               1048 0c1b  Erazor II
                1092 0550  Viper V550
                1092 0552  Viper V550
                1092 4804  Viper V550
                1092 4904  Viper V550
                1092 4914  Viper V550
                1092 8225  Viper V550
+               10b4 273d  Velocity 4400
+               10b4 2740  Velocity 4400
                10de 0020  Riva TNT
                1102 1015  Graphics Blaster CT6710
                1102 1016  Graphics Blaster RIVA TNT
-       0028  Riva TnT2 [NV5]
+       0028  NV5 [Riva TnT2]
                1043 0200  AGP-V3800 SGRAM
                1043 0201  AGP-V3800 SDRAM
                1043 0205  PCI-V3800
                1092 4804  Viper V770
                1092 4a00  Viper V770
                1092 4a02  Viper V770 Ultra
+               1092 5a00  RIVA TNT2/TNT2 Pro
                1092 6a02  Viper V770 Ultra
                1092 7a02  Viper V770 Ultra
                10de 0005  RIVA TNT2 Pro
+               10de 000f  Compaq NVIDIA TNT2 Pro
                1102 1020  3D Blaster RIVA TNT2
                1102 1026  3D Blaster RIVA TNT2 Digital
                14af 5810  Maxi Gamer Xentor
-       0029  Riva TnT2 Ultra [NV5]
+       0029  NV5 [Riva TnT2 Ultra]
                1043 0200  AGP-V3800 Deluxe
                1043 0201  AGP-V3800 Ultra SDRAM
                1043 0205  PCI-V3800 Ultra
                1102 1029  3D Blaster RIVA TNT2 Ultra
                1102 102f  3D Blaster RIVA TNT2 Ultra
                14af 5820  Maxi Gamer Xentor 32
-       002a  Riva TnT2 [NV5]
-       002b  Riva TnT2 [NV5]
-       002c  Vanta [NV6]
+       002a  NV5 [Riva TnT2]
+       002b  NV5 [Riva TnT2]
+       002c  NV6 [Vanta]
                1043 0200  AGP-V3800 Combat SDRAM
                1043 0201  AGP-V3800 Combat
                1092 6820  Viper V730
                1102 1031  CT6938 VANTA 8MB
                1102 1034  CT6894 VANTA 16MB
                14af 5008  Maxi Gamer Phoenix 2
-       002d  Vanta [NV6]
+       002d  RIVA TNT2 Model 64
                1043 0200  AGP-V3800M
                1043 0201  AGP-V3800M
                1102 1023  CT6892 RIVA TNT2 Value
                1102 1024  CT6932 RIVA TNT2 Value 32Mb
-               1102 102c  CT6931 RIVA TNT2 Value (Jumper)
+               1102 102c  CT6931 RIVA TNT2 Value [Jumper]
                1462 8808  MSI-8808
-       002e  Vanta [NV6]
-       002f  Vanta [NV6]
-       00a0  Riva TNT2
+               1554 1041  PixelView RIVA TNT2 M64 32MB
+       002e  NV6 [Vanta]
+       002f  NV6 [Vanta]
+       00a0  NV5 [Riva TNT2]
                14af 5810  Maxi Gamer Xentor
-       0100  GeForce 256
+       0100  NV10 [GeForce 256 SDR]
                1043 0200  AGP-V6600 SGRAM
                1043 0201  AGP-V6600 SDRAM
                1043 4008  AGP-V6600 SGRAM
                1043 4009  AGP-V6600 SDRAM
                1102 102d  CT6941 GeForce 256
-       0101  GeForce 256 DDR
+               14af 5022  3D Prophet SE
+       0101  NV10 [GeForce 256 DDR]
                1043 0202  AGP-V6800 DDR
                1043 400a  AGP-V6800 DDR SGRAM
                1043 400b  AGP-V6800 DDR SDRAM
                1102 102e  CT6971 GeForce 256 DDR
                14af 5021  3D Prophet DDR-DVI
-       0103  Quadro (GeForce 256 GL)
-       0110  NV11 (GeForce2 MX)
-       0111  NV11 (GeForce2 MX DDR)
-       0112  GeForce2 Go
-       0113  NV11 (GeForce2 MXR)
-       0150  NV15 (GeForce2 Pro)
+       0103  NV10 [Quadro]
+       0110  NV11 [GeForce2 MX]
+               1043 4015  AGP-V7100 Pro
+               1043 4031  V7100 Pro with TV output
+               14af 7103  3D Prophet II MX Dual-Display
+       0111  NV11 [GeForce2 MX DDR]
+       0112  NV11 [GeForce2 Go]
+       0113  NV11 [GeForce2 MXR]
+       0150  NV15 [GeForce2 GTS]
+               1043 4016  V7700 AGP Video Card
                107d 2840  WinFast GeForce2 GTS with TV output
-       0151  NV15 DDR (GeForce2 GTS)
-       0152  NV15 Bladerunner (GeForce2 Ultra)
-       0153  NV15 GL (Quadro2 Pro)
-       0200  NV20 (GeForce3)
-       0203  Quadro DCC
+               1462 8831  Creative GeForce2 Pro
+       0151  NV15 [GeForce2 Ti]
+       0152  NV15 [GeForce2 Ultra, Bladerunner]
+               1048 0c56  GLADIAC Ultra
+       0153  NV15 [Quadro2 Pro]
+       0170  NV17 [GeForce4 MX460]
+       0171  NV17 [GeForce4 MX440]
+       0172  NV17 [GeForce4 MX420]
+       0173  NV1x
+       0174  NV17 [GeForce4 440 Go]
+       0175  NV17 [GeForce4 420 Go]
+       0176  NV17 [GeForce4 420 Go 32M]
+       0178  Quadro4 500XGL
+       0179  NV17 [GeForce4 440 Go 64M]
+       017a  Quadro4 200/400NVS
+       017b  Quadro4 550XGL
+       017c  Quadro4 550 GoGL
+       01a0  NV15 [GeForce2 - nForce GPU]
+       01a4  nForce CPU bridge
+       01ab  nForce 420 Memory Controller (DDR)
+       01ac  nForce 220/420 Memory Controller
+       01ad  nForce 220/420 Memory Controller
+       01b1  nForce Audio
+       01b2  nForce ISA Bridge
+       01b4  nForce PCI System Management
+       01b7  nForce AGP to PCI Bridge
+       01b8  nForce PCI-to-PCI bridge
+       01bc  nForce IDE
+       0200  NV20 [GeForce3]
+               1043 402f  AGP-V8200 DDR
+       0201  NV20 [GeForce3 Ti200]
+       0202  NV20 [GeForce3 Ti500]
+               1043 405b  V8200 T5
+       0203  NV20 [Quadro DCC]
+       0250  NV25 [GeForce4 Ti4600]
+       0251  NV25 [GeForce4 Ti4400]
+       0253  NV25 [GeForce4 Ti4200]
+       0258  Quadro4 900XGL
+       0259  Quadro4 750XGL
+       025b  Quadro4 700XGL
 10df  Emulex Corporation
        10df  Light Pulse Fibre Channel Adapter
        1ae5  LP6000 Fibre Channel Host Adapter
        f700  LP7000 Fibre Channel Host Adapter
+       f800  LP8000 Fibre Channel Host Adapter
+       f900  LP9000 Fibre Channel Host Adapter
 10e0  Integrated Micro Solutions Inc.
        5026  IMS5026/27/28
        5027  IMS5027
        8043  LANai4.x [Myrinet LANai interface chip]
        8062  S5933_PARASTATION
        807d  S5933 [Matchmaker]
-       8088  Kingsberg Spacetec Format Synchronizer
-       8089  Kingsberg Spacetec Serial Output Board
+       8088  Kongsberg Spacetec Format Synchronizer
+       8089  Kongsberg Spacetec Serial Output Board
        809c  S5933_HEPC3
        80d7  PCI-9112
        80d9  PCI-9118
        80da  PCI-9812
        811a  PCI-IEEE1355-DS-DE Interface
        8170  S5933 [Matchmaker] (Chipset Development Tool)
+       82db  AJA HDNTV HD SDI Framestore
 10e9  Alps Electric Co., Ltd.
 10ea  Intergraphics Systems
        1680  IGA-1680
        8111  Twist3 Frame Grabber
 10ec  Realtek Semiconductor Co., Ltd.
        8029  RTL-8029(AS)
-               10b8 2011  EZ-Card
-               10ec 8029  RT8029(AS)
+               10b8 2011  EZ-Card (SMC1208)
+               10ec 8029  RTL-8029(AS)
                1113 1208  EN1208
                1186 0300  DE-528
                1259 2400  AT-2400
                10ec 8129  RT8129 Fast Ethernet Adapter
        8138  RT8139 (B/C) Cardbus Fast Ethernet Adapter
                10ec 8138  RT8139 (B/C) Fast Ethernet Adapter
-       8139  RTL-8139
+       8139  RTL-8139/8139C/8139C+
                1025 8920  ALN-325
                1025 8921  ALN-325
                10bd 0320  EP-320X-R
                10ec 8139  RT8139
                1186 1300  DFE-538TX
                1186 1320  SN5200
+               1186 8139  DRN-32TX
                1259 2500  AT-2500TX
+               1259 2503  AT-2500TX/ACPI
                1429 d010  ND010
                1432 9130  EN-9130TX
                1436 8139  RT8139
                8e2e 7000  KF-230TX
                8e2e 7100  KF-230TX/2
                a0a0 0007  ALN-325C
+       8169  RTL-8169
 10ed  Ascii Corporation
        7310  V7310
 10ee  Xilinx, Inc.
        3fc1  RME Digi96/8
        3fc2  RME Digi96/8 Pro
        3fc3  RME Digi96/8 Pad
+       3fc4  RME Digi9652 (Hammerfall)
+       3fc5  RME Hammerfall DSP
 10ef  Racore Computer Products, Inc.
        8154  M815x Token Ring Adapter
 10f0  Peritek Corporation
        000c  TARGA 1000
 10fb  Thesys Gesellschaft für Mikroelektronik mbH
 10fc  I-O Data Device, Inc.
+# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives
+       0003  Cardbus IDE Controller
 10fd  Soyo Computer, Inc
 10fe  Fast Multimedia AG
 10ff  NCube
                1102 8025  SBLive! Mainboard Implementation
                1102 8026  CT4830 SBLive! Value
                1102 8027  CT4832 SBLive! Value
+               1102 8028  CT4760 SBLive! OEM version
                1102 8031  CT4831 SBLive! Value
                1102 8040  CT4760 SBLive!
                1102 8051  CT4850 SBLive! Value
-       7002  SB Live!
+               1102 8061  SBLive! Player 5.1
+       0004  SB Audigy
+               1102 0051  SB0090 Audigy Player
+       4001  SB Audigy FireWire Port
+       7002  SB Live! MIDI/Game Port
                1102 0020  Gameport Joystick
+       7003  SB Audigy MIDI/Game port
+               1102 0040  SB Audigy MIDI/Gameport
        8938  ES1371
 1103  Triones Technologies, Inc.
        0003  HPT343
-       0004  HPT366 / HPT370
+# Revisions: 01=HPT366, 03=HPT370, 04=HPT370A, 05=HPT372
+       0004  HPT366/368/370/370A/372
+               1103 0001  HPT370A
                1103 0005  HPT370 UDMA100
+       0005  HPT372A
+       0006  HPT302
+       0007  HPT371
+       0008  HPT374
 1104  RasterOps Corp.
 1105  Sigma Designs, Inc.
+       1105  REALmagic Xcard MPEG 1/2/3/4 DVD Decoder
        8300  REALmagic Hollywood Plus DVD Decoder
+       8400  EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder
 1106  VIA Technologies, Inc.
+       0130  VT6305 1394.A Controller
        0305  VT8363/8365 [KT133/KM133]
+               1043 8033  A7V Mainboard
+               1043 8042  A7V133/A7V133-C Mainboard
+               147b a401  KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard
        0391  VT8371 [KX133]
        0501  VT8501 [Apollo MVP4]
        0505  VT82C505
        0561  VT82C561
-       0571  Bus Master IDE
+       0571  VT82C586B PIPC Bus Master IDE
        0576  VT82C576 3V [Apollo Master]
        0585  VT82C585VP [Apollo VP1/VPX]
        0586  VT82C586/A/B PCI-to-ISA [Apollo VP]
        0605  VT8605 [ProSavage PM133]
        0680  VT82C680 [Apollo P6]
        0686  VT82C686 [Apollo Super South]
+               1043 8033  A7V Mainboard
+               1043 8042  A7V133/A7V133-C Mainboard
                1106 0000  VT82C686/A PCI to ISA Bridge
                1106 0686  VT82C686/A PCI to ISA Bridge
        0691  VT82C693A/694x [Apollo PRO133x]
        1106  VT82C570MV
        1571  VT82C416MV
        1595  VT82C595/97 [Apollo VP2/97]
-       3038  UHCI USB
+       3038  USB
+               0925 1234  USB Controller
                1234 0925  MVP3 USB Controller
        3040  VT82C586B ACPI
-       3043  VT86C100A [Rhine 10/100]
+       3043  VT86C100A [Rhine]
                10bd 0000  VT86C100A Fast Ethernet Adapter
                1106 0100  VT86C100A Fast Ethernet Adapter
-               1186 1400  DFE-530TX
-       3044  OHCI Compliant IEEE 1394 Host Controller
+               1186 1400  DFE-530TX rev A
+       3044  IEEE 1394 Host Controller
        3050  VT82C596 Power Management
        3051  VT82C596 Power Management
        3057  VT82C686 [Apollo Super ACPI]
-       3058  AC97 Audio Controller
+               1043 8033  A7V Mainboard
+               1043 8042  A7V133/A7V133-C Mainboard
+       3058  VT82C686 AC97 Audio Controller
+               0e11 b194  Soundmax integrated digital audio
+               1106 4511  Onboard Audio on EP7KXA
+               1458 7600  Onboard Audio
                1462 3091  MS-6309 Onboard Audio
-       3059  AC97 Audio Controller
-       3065  Ethernet Controller
+               15dd 7609  Onboard Audio
+       3059  VT8233 AC97 Audio Controller
+       3065  VT6102 [Rhine-II]
+               1186 1400  DFE-530TX rev A
+               1186 1401  DFE-530TX rev B
        3068  AC97 Modem Controller
        3074  VT8233 PCI to ISA Bridge
        3091  VT8633 [Apollo Pro266]
        3099  VT8367 [KT266]
+               1043 8064  A7V266-E
+               1043 807f  A7V333
+       3101  VT8653 Host Bridge
+       3102  VT8662 Host Bridge
+       3103  VT8615 Host Bridge
+       3104  USB 2.0
        3109  VT8233C PCI to ISA Bridge
+       3112  VT8361 [KLE133] Host Bridge
+       3128  VT8753 [P4X266 AGP]
+       3133  VT3133 Host Bridge
+       3147  VT8233A ISA Bridge
+       3148  P4M266 Host Bridge
+       3156  P/KN266 Host Bridge
+       3177  VT8233A ISA Bridge
        5030  VT82C596 ACPI [Apollo PRO]
        6100  VT85C100A [Rhine II]
        8231  VT8231 [PCI-to-ISA Bridge]
-       8235  VT8235 Power Management
+       8235  VT8235 ACPI
        8305  VT8363/8365 [KT133/KM133 AGP]
        8391  VT8371 [KX133 AGP]
        8501  VT8501 [Apollo MVP4 AGP]
        8601  VT8601 [Apollo ProMedia AGP]
        8605  VT8605 [PM133 AGP]
        8691  VT82C691 [Apollo Pro]
+       8693  VT82C693 [Apollo Pro Plus] PCI Bridge
        b091  VT8633 [Apollo Pro266 AGP]
-       b099  VT8367 [KT266 AGP]
+       b099  VT8367 [KT333 AGP]
+       b101  VT8653 AGP Bridge
+       b102  VT8362 AGP Bridge
+       b103  VT8615 AGP Bridge
+       b112  VT8361 [KLE133] AGP Bridge
 1107  Stratus Computers
        0576  VIA VT82C570MV [Apollo] (Wrong vendor ID!)
 1108  Proteon, Inc.
        6120  SZB6120
 110b  Chromatic Research Inc.
        0001  Mpact Media Processor
+       0004  Mpact 2
 110c  Mini-Max Technology, Inc.
 110d  Znyx Advanced Systems
 110e  CPU Technology
        5105  10Mbps Network card
        9211  EN-1207D Fast Ethernet Adapter
                1113 9211  EN-1207D Fast Ethernet Adapter
+       9511  Fast Ethernet Adapter
 1114  Atmel Corporation
 1115  3D Labs
 1116  Data Translation
        0001  Powerbis Bridge
 111d  Integrated Device Tech
        0001  IDT77211 ATM Adapter
+       0003  IDT77252 ATM network controller
 111e  Eldec
 111f  Precision Digital Images
        4a47  Precision MX Video engine interface
        0200  ForeRunner PCA-200 ATM
        0210  PCA-200PC
        0250  ATM
-       0300  PCA-200E
+       0300  ForeRunner PCA-200EPC ATM
        0310  ATM
        0400  ForeRunnerHE ATM Adapter
+               1127 0400  ForeRunnerHE ATM
 1129  Firmworks
 112a  Hermes Electronics Company, Ltd.
 112b  Linotype - Hell AG
        0001  MVC IM-PCI Video frame grabber/processor
 1130  Computervision
 1131  Philips Semiconductors
+       7130  SAA7130 Video Broadcast Decoder
+# PCI audio and video broadcast decoder (http://www.semiconductors.philips.com/pip/saa7134hl)
+       7134  SAA7134
        7145  SAA7145
        7146  SAA7146
                114b 2003  DVRaptor Video Edit/Capture Card
        7912  EiconCard S91
        7941  EiconCard S94
        7942  EiconCard S94
+       7943  EiconCard S94
+       7944  EiconCard S94
        b921  EiconCard P92
        b922  EiconCard P92
+       b923  EiconCard P92
        e001  DIVA 20PRO
                1133 e001  DIVA Pro 2.0 S/T
        e002  DIVA 20
                1133 e003  DIVA Pro 2.0 U
        e004  DIVA 20_U
                1133 e004  DIVA 2.0 U
+       e005  DIVA LOW
+               1133 e005  DIVA 2.01 S/T
        e010  DIVA Server BRI-2M
                1133 e010  DIVA Server BRI-2M
+       e012  DIVA Server BRI-8M
+               1133 e012  DIVA Server BRI-8M
        e014  DIVA Server PRI-30M
                1133 e014  DIVA Server PRI-30M
+       e018  DIVA Server BRI-2M/-2F
 1134  Mercury Computer Systems
        0001  Raceway Bridge
 1135  Fuji Xerox Co Ltd
 113f  Equinox Systems, Inc.
        0808  SST-64P Adapter
        1010  SST-128P Adapter
-       80c0  SST-16P Adapter
-       80c4  SST-16P Adapter
+       80c0  SST-16P DB Adapter
+       80c4  SST-16P RJ Adapter
        80c8  SST-16P Adapter
        8888  SST-4P Adapter
        9090  SST-8P Adapter
                1148 9844  SK-9844 (1000Base-SX dual link)
                1148 9861  SK-9861 (1000Base-SX VF45 single link)
                1148 9862  SK-9862 (1000Base-SX VF45 dual link)
+       4400  Gigabit Ethernet
 1149  Win System Corporation
 114a  VMIC
+       5579  VMIPCI-5579 (Reflective Memory Card)
        7587  VMIVME-7587
 114b  Canopus Co., Ltd
 114c  Annabooks
        001a  DataFirePRIme E1 (1-port)
        001b  AccelePort C/X (IBM)
        001d  DataFire RAS T1/E1/PRI
+               114f 0050  DataFire RAS E1 Adapter
+               114f 0051  DataFire RAS Dual E1 Adapter
+               114f 0052  DataFire RAS T1 Adapter
+               114f 0053  DataFire RAS Dual T1 Adapter
        0023  AccelePort RAS
        0024  DataFire RAS B4 ST/U
+               114f 0030  DataFire RAS BRI U Adapter
+               114f 0031  DataFire RAS BRI S/T Adapter
        0026  AccelePort 4r 920
        0027  AccelePort Xr 920
        0034  AccelePort 2r 920
        0035  DataFire DSP T1/E1/PRI cPCI
+       0040  AccelePort Xp
+       0042  AccelePort 2p PCI
+       0070  Datafire Micro V IOM2 (Europe)
+       0071  Datafire Micro V (Europe)
+       0072  Datafire Micro V IOM2 (North America)
+       0073  Datafire Micro V (North America)
        6001  Avanstar
 1150  Thinking Machines Corp
 1151  JAE Electronics Inc.
        0003  Cardbus Ethernet 10/100
                1014 0181  10/100 EtherJet Cardbus Adapter
                1014 1181  10/100 EtherJet Cardbus Adapter
+               1014 8181  10/100 EtherJet Cardbus Adapter
+               1014 9181  10/100 EtherJet Cardbus Adapter
                115d 0181  Cardbus Ethernet 10/100
                115d 1181  Cardbus Ethernet 10/100
+               1179 0181  Cardbus Ethernet 10/100
                8086 8181  EtherExpress PRO/100 Mobile CardBus 32 Adapter
                8086 9181  EtherExpress PRO/100 Mobile CardBus 32 Adapter
        0005  Cardbus Ethernet 10/100
        000b  Cardbus Ethernet 10/100
                1014 0183  10/100 EtherJet Cardbus Adapter
                115d 0183  Cardbus Ethernet 10/100
+       000c  Mini-PCI V.90 56k Modem
        000f  Cardbus Ethernet 10/100
                1014 0183  10/100 EtherJet Cardbus Adapter
                115d 0183  Cardbus Ethernet 10/100
        0101  Cardbus 56k modem
                115d 1081  Cardbus 56k Modem
        0103  Cardbus Ethernet + 56k Modem
+               1014 9181  Cardbus 56k Modem
+               1115 1181  Cardbus Ethernet 100 + 56k Modem
                115d 1181  CBEM56G-100 Ethernet + 56k Modem
                8086 9181  PRO/100 LAN + Modem56 CardBus
 115e  Peer Protocols Inc
 1165  Imagraph Corporation
        0001  Motion TPEG Recorder/Player with audio
 1166  ServerWorks
+       0005  CNB20-LE Host Bridge
        0007  CNB20-LE Host Bridge
        0008  CNB20HE Host Bridge
        0009  CNB20LE Host Bridge
        0010  CIOB30
        0011  CMIC-HE
+       0013  CNB20-HE Host Bridge
+       0014  CNB20-HE Host Bridge
+       0015  CMIC-GC Host Bridge
+       0016  CMIC-GC Host Bridge
+       0017  GCNB-LE Host Bridge
        0200  OSB4 South Bridge
        0201  CSB5 South Bridge
+       0203  CSB6 South Bridge
        0211  OSB4 IDE Controller
        0212  CSB5 IDE Controller
+       0213  CSB6 RAID/IDE Controller
        0220  OSB4/CSB5 OHCI USB Controller
+       0221  CSB6 OHCI USB Controller
+       0225  GCLE Host Bridge
+       0227  GCLE-2 Host Bridge
 1167  Mutoh Industries Inc
 1168  Thine Electronics Inc
 1169  Centre for Development of Advanced Computing
 1178  Alfa, Inc.
        afa1  Fast Ethernet Adapter
 1179  Toshiba America Info Systems
+       0103  EX-IDE Type-B
        0404  DVD Decoder card
        0406  Tecra Video Capture device
        0407  DVD Decoder card (Version 2)
        0618  CPU to PCI and PCI to ISA bridge
 # Claimed to be Lucent DSP1645 [Mars], but that's apparently incorrect. Does anyone know the correct ID?
        0701  FIR Port
+       0804  TC6371AF SmartMedia Controller
+       0805  SD TypA Controller
        0d01  FIR Port Type-DO
                1179 0001  FIR Port Type-DO
 117a  A-Trend Technology
        0466  RL5c466
        0475  RL5c475
        0476  RL5c476 II
+               104d 80df  Vaio PCG-FX403
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
        0477  RL5c477
        0478  RL5c478
+               1014 0184  ThinkPad A30p (2653-64G)
+       0522  R5C522 IEEE 1394 Controller
+               1014 01cf  ThinkPad A30p (2653-64G)
+       0551  R5C551 IEEE 1394 Controller
+       0552  R5C552 IEEE 1394 Controller
 1181  Telmatics International
 1183  Fujikura Ltd
 1184  Forks Inc
 1185  Dataworld International Ltd
 1186  D-Link System Inc
        0100  DC21041
-       1002  Sundance Ethernet
+       1002  DL10050 Sundance Ethernet
+               1186 1002  DFE-550TX
+               1186 1012  DFE-580TX
        1300  RTL8139 Ethernet
+               1186 1300  DFE-538TX 10/100 Ethernet Adapter
+               1186 1301  DFE-530TX+ 10/100 Ethernet Adapter
+       1340  DFE-690TXD CardBus PC Card
+       1561  DRP-32TXD Cardbus PC Card
        4000  DL2K Ethernet
 1187  Advanced Technology Laboratories, Inc.
 1188  Shima Seiki Manufacturing Ltd.
        0005  ATP850UF
        0006  ATP860 NO-BIOS
        0007  ATP860
+       0008  ATP865 NO-ROM
+       0009  ATP865
        8002  AEC6710 SCSI-2 Host Adapter
        8010  AEC6712UW SCSI
        8020  AEC6712U SCSI
                11ad ffff  LNE100TX
                1385 f004  FA310TX
        c115  LNE100TX [Linksys EtherFast 10/100]
+               11ad c001  LNE100TX [ver 2.0]
 11ae  Aztech System Ltd
 11af  Avid Technology Inc.
 11b0  V3 Semiconductor Inc.
        0440  56k WinModem
                0001 0440  LT WinModem 56k Data+Fax+Voice+Dsvd
                1033 8015  LT WinModem 56k Data+Fax+Voice+Dsvd
+               1033 8047  LT WinModem 56k Data+Fax+Voice+Dsvd
                1033 804f  LT WinModem 56k Data+Fax+Voice+Dsvd
                10cf 102c  LB LT Modem V.90 56k
                10cf 104a  BIBLO LT Modem 56k
                1179 0001  Internal V.90 Modem
                11c1 0440  LT WinModem 56k Data+Fax+Voice+Dsvd
                122d 4101  MDP7800-U Modem
+               122d 4102  MDP7800SP-U Modem
                13e0 0040  LT WinModem 56k Data+Fax+Voice+Dsvd
                13e0 0440  LT WinModem 56k Data+Fax+Voice+Dsvd
                13e0 0441  LT WinModem 56k Data+Fax+Voice+Dsvd
+               13e0 0450  LT WinModem 56k Data+Fax+Voice+Dsvd
                13e0 f100  LT WinModem 56k Data+Fax+Voice+Dsvd
                13e0 f101  LT WinModem 56k Data+Fax+Voice+Dsvd
                144d 2101  LT56PV Modem
                149f 0440  LT WinModem 56k Data+Fax+Voice+Dsvd
        0441  56k WinModem
                1033 804d  LT WinModem 56k Data+Fax
+               1033 8065  LT WinModem 56k Data+Fax
                1092 0440  Supra 56i
                1179 0001  Internal V.90 Modem
                11c1 0440  LT WinModem 56k Data+Fax
                13e0 0100  LT WinModem 56k Data+Fax
                13e0 0410  LT WinModem 56k Data+Fax
                13e0 0420  TelePath Internet 56k WinModem
+               13e0 0440  LT WinModem 56k Data+Fax
                13e0 0443  LT WinModem 56k Data+Fax
+               13e0 f102  LT WinModem 56k Data+Fax
                1416 9804  CommWave 56k Modem
                141d 0440  LT WinModem 56k Data+Fax
                144f 0441  Lucent 56k V.90 DF Modem
+               144f 0449  Lucent 56k V.90 DF Modem
+               144f 110d  Lucent Win Modem
                1468 0441  Presario 56k V.90 DF Modem
+               1668 0440  Lucent Win Modem
        0442  56k WinModem
                0001 0440  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                11c1 0440  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                13e0 0442  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                13fc 2471  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                144d 2104  LT56PT Modem
+               144f 1104  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                149f 0440  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                1668 0440  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
        0443  LT WinModem
        0446  LT WinModem
        0447  LT WinModem
        0448  WinModem 56k
+               1014 0131  Lucent Win Modem
+               1033 8066  LT WinModem 56k Data+Fax+Voice+Dsvd
+               13e0 0030  56k Voice Modem
                13e0 0040  LT WinModem 56k Data+Fax+Voice+Dsvd
+# Actiontech eth+modem card as used by Dell &c.
+               1668 2400  LT WinModem 56k (MiniPCI Ethernet+Modem)
        0449  WinModem 56k
                0e11 b14d  56k V.90 Modem
                13e0 0020  LT WinModem 56k Data+Fax
                13e0 0041  TelePath Internet 56k WinModem
+               1436 0440  Lucent Win Modem
                144f 0449  Lucent 56k V.90 DFi Modem
+               1468 0410  IBM ThinkPad T23 (2647-4MG)
+               1468 0440  Lucent Win Modem
                1468 0449  Presario 56k V.90 DFi Modem
        044a  F-1156IV WinModem (V90, 56KFlex)
+               10cf 1072  LB Global LT Modem
                13e0 0012  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                13e0 0042  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
                144f 1005  LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
        044c  LT WinModem
        044d  LT WinModem
        044e  LT WinModem
+       044f  V90 WildWire Modem
        0450  LT WinModem
        0451  LT WinModem
        0452  LT WinModem
        0458  LT WinModem
        0459  LT WinModem
        045a  LT WinModem
+       0461  V90 WildWire Modem
+       0462  V90 WildWire Modem
        0480  Venus Modem (V90, 56KFlex)
+       5801  USB
+       5802  USS-312 USB Controller
+       5811  FW323
+               dead 0800  FireWire Host Bus Adapter
 11c2  Sand Microelectronics
 11c3  NEC Corp
 11c4  Document Technologies, Inc
 11d2  Intercom Inc.
 11d3  Trancell Systems Inc
 11d4  Analog Devices
+       1805  SM56 PCI modem
        1889  AD1889 sound chip
 11d5  Ikon Corporation
        0115  10115
        0113  FreedomLine 100
        1401  ReadyLink 2000
        2011  RL100-ATX 10/100
+               11f6 2011  RL100-ATX
        2201  ReadyLink 100TX (Winbond W89C840)
                11f6 2011  ReadyLink 100TX
        9881  RL100TX
        0004  RocketPort 32 Intf
        0005  RocketPort Octacable
        0006  RocketPort 8J
+       0007  RocketPort 4-port
        0008  RocketPort 8-port
        0009  RocketPort 16-port
        000a  RocketPort Plus Quadcable
        000b  RocketPort Plus Octacable
        000c  RocketPort 8-port Modem
+       8015  RocketPort 4-port UART 16954
 11ff  Scion Corporation
 1200  CSS Corporation
 1201  Vista Controls Corp
 120c  Technical Corp.
 120d  Compression Labs, Inc.
 120e  Cyclades Corporation
-       0100  Cyclom_Y below first megabyte
-       0101  Cyclom_Y above first megabyte
-       0102  Cyclom_4Y below first megabyte
-       0103  Cyclom_4Y above first megabyte
-       0104  Cyclom_8Y below first megabyte
-       0105  Cyclom_8Y above first megabyte
-       0200  Cyclom_Z below first megabyte
-       0201  Cyclom_Z above first megabyte
-       0300  PC300 RX 2
-       0301  PC300 RX 1
-       0310  PC300 TE 2
-       0311  PC300 TE 1
+       0100  Cyclom-Y below first megabyte
+       0101  Cyclom-Y above first megabyte
+       0102  Cyclom-4Y below first megabyte
+       0103  Cyclom-4Y above first megabyte
+       0104  Cyclom-8Y below first megabyte
+       0105  Cyclom-8Y above first megabyte
+       0200  Cyclades-Z below first megabyte
+       0201  Cyclades-Z above first megabyte
+       0300  PC300/RSV or /X21 (2 ports)
+       0301  PC300/RSV or /X21 (1 port)
+       0310  PC300/TE (2 ports)
+       0311  PC300/TE (1 port)
+       0320  PC300/TE-M (2 ports)
+       0321  PC300/TE-M (1 port)
+       0400  PC400
 120f  Essential Communications
        0001  Roadrunner serial HIPPI
 1210  Hyperparallel Technologies
 1215  Interware Co., Ltd
 1216  Purup Prepress A/S
 1217  O2 Micro, Inc.
-       6729  6729
-       673a  6730
-       6832  6832
-       6836  6836
+       6729  OZ6729
+       673a  OZ6730
+       6832  OZ6832/6833 Cardbus Controller
+       6836  OZ6836/6860 Cardbus Controller
        6872  OZ6812 Cardbus Controller
+       6925  OZ6922 Cardbus Controller
        6933  OZ6933 Cardbus Controller
+               1025 1016  Travelmate 612 TX
+       6972  OZ6912 Cardbus Controller
 1218  Hybricon Corp.
 1219  First Virtual Corporation
 121a  3Dfx Interactive, Inc.
                1092 8030  Monster Fusion
                1092 8035  Monster Fusion AGP
                10b0 0001  Dragon 4000
-               1102 1017  CT6760 3D Blaster Banshee
+               1102 1018  3D Blaster Banshee VE
                121a 0001  Voodoo Banshee AGP
                121a 0003  Voodoo Banshee AGP SGRAM
                121a 0004  Voodoo Banshee
                121a 0062  Voodoo3 3500 TV (SECAM)
        0009  Voodoo 4 / Voodoo 5
                121a 0009  Voodoo5 AGP 5500/6000
+       0057  Voodoo 3/3000 [Avenger]
 121b  Advanced Telecommunications Modules
 121c  Nippon Texaco., Ltd
 121d  Lippert Automationstechnik GmbH
 1240  Marathon Technologies Corp.
 1241  DSC Communications
 1242  Jaycor Networks, Inc.
+       1242  JNI Corporation (former Jaycor Networks, Inc.)
        4643  FCI-1063 Fibre Channel Adapter
+       6562  FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+       656a  FCX-6562 PCI-X Fibre Channel Adapter
 1243  Delphax
 1244  AVM Audiovisuelles MKTG & Computer System GmbH
        0700  B1 ISDN
+       0800  C4 ISDN
        0a00  A1 ISDN [Fritz]
                1244 0a00  FRITZ!Card ISDN Controller
+       0e00  Fritz!PCI v2.0 ISDN
+       1100  C2 ISDN
+       1200  T1 ISDN
 1245  A.P.D., S.A.
 1246  Dipix Technologies, Inc.
 1247  Xylon Research, Inc.
 1249  Samsung Electronics Co., Ltd.
 124a  AEG Electrocom GmbH
 124b  SBS/Greenspring Modular I/O
+       0040  cPCI-200 Four Slot IndustryPack carrier
+               124b 9080  PCI9080 Bridge
 124c  Solitron Technologies, Inc.
 124d  Stallion Technologies, Inc.
        0000  EasyConnection 8/32
        0002  EasyConnection 8/64
        0003  EasyIO
+       0004  EasyConnection/RA
 124e  Cylink
 124f  Infotrend Technology, Inc.
        0041  IFT-2000 Series RAID Controller
 125b  Asix Electronics Corporation
        1400  ALFA GFC2204
 125c  Aurora Technologies, Inc.
+       0640  Aries 16000P
 125d  ESS Technology
        0000  ES336H Fax Modem (Early Model)
        1948  Solo?
        1989  ESS Modem
                125d 1989  ESS Modem
        1998  ES1983S Maestro-3i PCI Audio Accelerator
+               1028 00e6  ES1983S Maestro-3i (Dell Inspiron 8100)
        1999  ES1983S Maestro-3i PCI Modem Accelerator
+       199a  ES1983S Maestro-3i PCI Audio Accelerator
+       199b  ES1983S Maestro-3i PCI Modem Accelerator
        2808  ES336H Fax Modem (Later Model)
        2838  ES2838/2839 SuperLink Modem
        2898  ES2898 Modem
+               125d 0424  ES56-PI Data Fax Modem
+               125d 0425  ES56T-PI Data Fax Modem
+               125d 0426  ES56V-PI Data Fax Modem
+               125d 0427  VW-PI Data Fax Modem
+               125d 0428  ES56ST-PI Data Fax Modem
+               125d 0429  ES56SV-PI Data Fax Modem
+               147a c001  ES56-PI Data Fax Modem
+               14fe 0428  ES56-PI Data Fax Modem
+               14fe 0429  ES56-PI Data Fax Modem
 125e  Specialvideo Engineering SRL
 125f  Concurrent Technologies, Inc.
 1260  Harris Semiconductor
+       3873  Prism 2.5 Wavelan chipset
+               1186 3501  DWL-520 Wireless PCI Adapter
        8130  HMP8130 NTSC/PAL Video Decoder
        8131  HMP8131 NTSC/PAL Video Decoder
 1261  Matsushita-Kotobuki Electronics Industries, Ltd.
        0002  DirecPC
 1274  Ensoniq
        1371  ES1371 [AudioPCI-97]
+               0e11 0024  AudioPCI on Motherboard Compaq Deskpro
                0e11 b1a7  ES1371, ES1373 AudioPCI
                1033 80ac  ES1371, ES1373 AudioPCI
                1042 1854  Tazer
                4942 4c4c  Creative Sound Blaster AudioPCI128
        5880  5880 AudioPCI
                1274 2000  Creative Sound Blaster AudioPCI128
+               1274 2003  Creative SoundBlaster AudioPCI 128
                1274 5880  Creative Sound Blaster AudioPCI128
+               1458 a000  5880 AudioPCI On Motherboard 6OXET
                1462 6880  5880 AudioPCI On Motherboard MS-6188 1.00
                270f 2001  5880 AudioPCI On Motherboard 6CTR
                270f 2200  5880 AudioPCI On Motherboard 6WTX
 1276  Switched Network Technologies, Inc.
 1277  Comstream
 1278  Transtech Parallel Systems Ltd.
+       0701  TPE3/TM3 PowerPC Node
 1279  Transmeta Corporation
        0295  Northbridge
        0395  LongRun Northbridge
        0397  BIOS scratchpad
 127a  Rockwell International
        1002  HCF 56k Data/Fax Modem
-               122d 4002  HPG / MDP3858-U # Aztech
-               122d 4005  MDP3858-E # Aztech
-               122d 4007  MDP3858-A/-NZ # Aztech
-               122d 4012  MDP3858-SA # Aztech
-               122d 4017  MDP3858-W # Aztech
-               122d 4018  MDP3858-W # Aztech
+               1092 094c  SupraExpress 56i PRO [Diamond SUP2380]
+               122d 4002  HPG / MDP3858-U
+               122d 4005  MDP3858-E
+               122d 4007  MDP3858-A/-NZ
+               122d 4012  MDP3858-SA
+               122d 4017  MDP3858-W
+               122d 4018  MDP3858-W
+               127a 1002  Rockwell 56K D/F HCF Modem
        1003  HCF 56k Data/Fax Modem
-               0e11 b0bc  229-DF Zephyr # Compaq
-               0e11 b114  229-DF Cheetah # Compaq
-               1033 802b  229-DF # NEC
-               13df 1003  PCI56RX Modem # E-Tech Inc
-               13e0 0117  IBM # GVC
-               13e0 0147  IBM # GVC
-               13e0 0197  IBM # GVC
-               13e0 01c7  IBM # GVC
-               13e0 01f7  IBM # GVC
-               1436 1003  IBM # CIS
-               1436 1103  IBM # CIS
+               0e11 b0bc  229-DF Zephyr
+               0e11 b114  229-DF Cheetah
+               1033 802b  229-DF
+               13df 1003  PCI56RX Modem
+               13e0 0117  IBM
+               13e0 0147  IBM F-1156IV+/R3 Spain V.90 Modem
+               13e0 0197  IBM
+               13e0 01c7  IBM F-1156IV+/R3 WW V.90 Modem
+               13e0 01f7  IBM
+               1436 1003  IBM
+               1436 1103  IBM 5614PM3G V.90 Modem
                1436 1602  Compaq 229-DF Ducati
        1004  HCF 56k Data/Fax/Voice Modem
+               1048 1500  MicroLink 56k Modem
                10cf 1059  Fujitsu 229-DFRT
        1005  HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
-               1033 8029  229-DFSV # NEC
-               1033 8054  Modem # NEC
+               1033 8029  229-DFSV
+               1033 8054  Modem
                10cf 103c  Fujitsu
                10cf 1055  Fujitsu 229-DFSV
                10cf 1056  Fujitsu 229-DFSV
-               122d 4003  MDP3858SP-U # Aztech
-               122d 4006  Packard Bell MDP3858V-E # Aztech
-               122d 4008  MDP3858SP-A/SP-NZ # Aztech
-               122d 4009  MDP3858SP-E # Aztech
-               122d 4010  MDP3858V-U # Aztech
-               122d 4011  MDP3858SP-SA # Aztech
-               122d 4013  MDP3858V-A/V-NZ # Aztech
-               122d 4015  MDP3858SP-W # Aztech
-               122d 4016  MDP3858V-W # Aztech
-               122d 4019  MDP3858V-SA # Aztech
-               13df 1005  PCI56RVP Modem  # E-Tech Inc
-               13e0 0187  IBM # GVC
-               13e0 01a7  IBM # GVC
-               13e0 01b7  IBM # GVC
-               13e0 01d7  IBM # GVC
-               1436 1005  IBM # CIS
-               1436 1105  IBM # CIS
+               122d 4003  MDP3858SP-U
+               122d 4006  Packard Bell MDP3858V-E
+               122d 4008  MDP3858SP-A/SP-NZ
+               122d 4009  MDP3858SP-E
+               122d 4010  MDP3858V-U
+               122d 4011  MDP3858SP-SA
+               122d 4013  MDP3858V-A/V-NZ
+               122d 4015  MDP3858SP-W
+               122d 4016  MDP3858V-W
+               122d 4019  MDP3858V-SA
+               13df 1005  PCI56RVP Modem
+               13e0 0187  IBM
+               13e0 01a7  IBM
+               13e0 01b7  IBM DF-1156IV+/R3 Spain V.90 Modem
+               13e0 01d7  IBM DF-1156IV+/R3 WW V.90 Modem
+               1436 1005  IBM
+               1436 1105  IBM
+               1437 1105  IBM 5614PS3G V.90 Modem
+       1022  HCF 56k Modem
+               1436 1303  M3-5614PM3G V.90 Modem
        1023  HCF 56k Data/Fax Modem
-               122d 4020  Packard Bell MDP3858-WE # Aztech
-               122d 4023  MDP3858-UE # Aztech
-               13e0 0247  IBM # GVC
-               13e0 0297  IBM # GVC
-               13e0 02c7  IBM # GVC
-               1436 1203  IBM # CIS
-               1436 1303  IBM # CIS
+               122d 4020  Packard Bell MDP3858-WE
+               122d 4023  MDP3858-UE
+               13e0 0247  IBM F-1156IV+/R6 Spain V.90 Modem
+               13e0 0297  IBM
+               13e0 02c7  IBM F-1156IV+/R6 WW V.90 Modem
+               1436 1203  IBM
+               1436 1303  IBM
        1024  HCF 56k Data/Fax/Voice Modem
        1025  HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
                10cf 106a  Fujitsu 235-DFSV
-               122d 4021  Packard Bell MDP3858V-WE # Aztech
-               122d 4022  MDP3858SP-WE # Aztech
-               122d 4024  MDP3858V-UE # Aztech
-               122d 4025  MDP3858SP-UE # Aztech
+               122d 4021  Packard Bell MDP3858V-WE
+               122d 4022  MDP3858SP-WE
+               122d 4024  MDP3858V-UE
+               122d 4025  MDP3858SP-UE
        1026  HCF 56k PCI Speakerphone Modem
+       1032  HCF 56k Modem
+       1033  HCF 56k Modem
+       1034  HCF 56k Modem
        1035  HCF 56k PCI Speakerphone Modem
+       1036  HCF 56k Modem
        1085  HCF 56k Volcano PCI Modem
        2005  HCF 56k Data/Fax Modem
-               104d 8044  229-DFSV # Sony
-               104d 8045  229-DFSV # Sony
-               104d 8055  PBE/Aztech 235W-DFSV # Sony
-               104d 8056  235-DFSV # Sony
-               104d 805a  Modem # Sony
-               104d 805f  Modem # Sony
-               104d 8074  Modem # Sony
+               104d 8044  229-DFSV
+               104d 8045  229-DFSV
+               104d 8055  PBE/Aztech 235W-DFSV
+               104d 8056  235-DFSV
+               104d 805a  Modem
+               104d 805f  Modem
+               104d 8074  Modem
        2013  HSF 56k Data/Fax Modem
-               1179 0001  Modem # Toshiba
-               1179 ff00  Modem # Toshiba
+               1179 0001  Modem
+               1179 ff00  Modem
        2014  HSF 56k Data/Fax/Voice Modem
                10cf 1057  Fujitsu Citicorp III
-               122d 4050  MSP3880-U # Aztech
-               122d 4055  MSP3880-W # Aztech
+               122d 4050  MSP3880-U
+               122d 4055  MSP3880-W
        2015  HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
                10cf 1063  Fujitsu
                10cf 1064  Fujitsu
                1468 2015  Fujitsu
        2016  HSF 56k Data/Fax/Voice/Spkp Modem
-               122d 4051  MSP3880V-W # Aztech
-               122d 4052  MSP3880SP-W # Aztech
-               122d 4054  MSP3880V-U # Aztech
-               122d 4056  MSP3880SP-U # Aztech
-               122d 4057  MSP3880SP-A # Aztech
+               122d 4051  MSP3880V-W
+               122d 4052  MSP3880SP-W
+               122d 4054  MSP3880V-U
+               122d 4056  MSP3880SP-U
+               122d 4057  MSP3880SP-A
        4311  Riptide HSF 56k PCI Modem
                127a 4311  Ring Modular? Riptide HSF RT HP Dom
                13e0 0210  HP-GVC
                1235 4321  Hewlett Packard DF
                1235 4324  Hewlett Packard DF
                13e0 0210  Hewlett Packard DF
-               144d 2321  Riptide # Samsung
+               144d 2321  Riptide
        4322  Riptide PCI Game Controller
                1235 4322  Riptide PCI Game Controller
        8234  RapidFire 616X ATM155 Adapter
+               108d 0022  RapidFire 616X ATM155 Adapter
                108d 0027  RapidFire 616X ATM155 Adapter
 127b  Pixera Corporation
 127c  Crosspoint Solutions, Inc.
 1298  Spellcaster Telecommunications Inc.
 1299  Knowledge Technology Lab.
 129a  VMetro, inc.
+       0615  PBT-615 PCI-X Bus Analyzer
 129b  Image Access
 129c  Jaycor
 129d  Compcore Multimedia, Inc.
 12ac  Measurex Corporation
 12ad  Multidata GmbH
 12ae  Alteon Networks Inc.
-       0001  AceNIC Gigabit Ethernet (Fibre)
-               1410 0104  Gigabit Ethernet-SX PCI Adapter (14100401)
+       0001  AceNIC Gigabit Ethernet
+               12ae 0001  Gigabit Ethernet-SX (Universal)
+               1410 0104  Gigabit Ethernet-SX PCI Adapter
        0002  AceNIC Gigabit Ethernet (Copper)
+               12ae 0002  Gigabit Ethernet-T (3C986-T)
 12af  TDK USA Corp
 12b0  Jorge Scientific Corp
 12b1  GammaLink
        5598  PCI NE2K Ethernet
 12c4  Connect Tech Inc
 12c5  Picture Elements Incorporated
+       007e  Imaging/Scanning Subsystem Engine
+       007f  Imaging/Scanning Subsystem Engine
        0081  PCIVST [Grayscale Thresholding Engine]
        0085  Video Simulator/Sender
        0086  THR2 Multi-scale Thresholder
        0008  NV1
        0009  DAC64
        0018  Riva128
+               1048 0c10  VICTORY Erazor
                107b 8030  STB Velocity 128
                1092 0350  Viper V330
                1092 1092  Viper V330
                10b4 1b1b  STB Velocity 128
-               10b4 1b20  STB Velocity 128
+               10b4 1b1d  STB Velocity 128
+               10b4 1b1e  STB Velocity 128, PAL TV-Out
+               10b4 1b20  STB Velocity 128 Sapphire
                10b4 1b21  STB Velocity 128
                10b4 1b22  STB Velocity 128 AGP, NTSC TV-Out
                10b4 1b23  STB Velocity 128 AGP, PAL TV-Out
                10b4 1b27  STB Velocity 128 DVD
+               10b4 1b88  MVP Pro 128
                10b4 222a  STB Velocity 128 AGP
                10b4 2230  STB Velocity 128
+               10b4 2232  STB Velocity 128
                10b4 2235  STB Velocity 128 AGP
-               2a15 54a3  3DVision-SAGP
+               2a15 54a3  3DVision-SAGP / 3DexPlorer 3000
        0019  Riva128ZX
        0020  TNT
        0028  TNT2
        002c  VTNT2
        00a0  ITNT2
 12d3  Vingmed Sound A/S
-12d4  DGM&S
+12d4  Ulticom (Formerly DGM&S)
 12d5  Equator Technologies
 12d6  Analogic Corp
 12d7  Biotronic SRL
                1092 2100  Sonic Impact A3D
                1092 2110  Sonic Impact A3D
                1092 2200  Sonic Impact A3D
+               122d 1002  AU8820 Vortex Digital Audio Processor
                12eb 0001  AU8820 Vortex Digital Audio Processor
                5053 3355  Montego
        0002  Vortex 2
 135a  Brain Boxes
 135b  Giganet Inc
 135c  Quatech Inc
+       00f0  MPAC-100 Syncronous Serial Card (Zilog 85230)
 135d  ABB Network Partner AB
 135e  Sealevel Systems Inc
        7101  Single Port RS-232/422/485/530
 1383  Controlnet Inc
 1384  Reality Simulation Systems Inc
 1385  Netgear
+       4100  802.11b Wireless Adapter (MA301)
        620a  GA620
        622a  GA622
        630a  GA630
        2180  Intellio C218 Turbo PCI
        3200  Intellio C320 Turbo PCI
 1394  Level One Communications
+       0001  LXT1001 Gigabit Ethernet
+               1394 0001  NetCelerator Adapter
 1395  Ambicom Inc
 1396  Cipher Systems Inc
 1397  Cologne Chip Designs GmbH
 1398  Clarion co. Ltd
 1399  Rios systems Co Ltd
 139a  Alacritech Inc
+       0001  Quad Port 10/100 Server Accelerator
+       0003  Single Port 10/100 Server Accelerator
+       0005  Single Port Gigabit Server Accelerator
 139b  Mediasonic Multimedia Systems Ltd
 139c  Quantum 3d Inc
 139d  EPL limited
 13a0  Crystal Group Inc
 13a1  Kawasaki Heavy Industries Ltd
 13a2  Ositech Communications Inc
-13a3  Hi-Fn
+13a3  Hifn Inc.
+       0005  7751 Security Processor
+       0006  6500 Public Key Processor
+       0007  7811 Security Processor
+       0012  7951 Security Processor
 13a4  Rascom Inc
 13a5  Audio Digital Imaging Inc
 13a6  Videonics Inc
 13a7  Teles AG
 13a8  Exar Corp.
+       0158  XR17C158 Octal UART
 13a9  Siemens Medical Systems, Ultrasound Group
 13aa  Broadband Networks Inc
 13ab  Arcom Control Systems Ltd
 13c1  3ware Inc
        1000  3ware ATA-RAID
        1001  3ware 7000-series ATA-RAID
+       1002  3ware ATA-RAID
 13c2  Technotrend Systemtechnik GmbH
 13c3  Janz Computer AG
 13c4  Phase Metrics
 13cf  Studio Audio & Video Ltd
 13d0  Techsan Electronics Co Ltd
 13d1  Abocom Systems Inc
+       ab06  RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter
 13d2  Shark Multimedia Inc
 13d3  IMC Networks
 13d4  Graphics Microsystems Inc
 13ee  Hayes Microcomputer Products Inc
 13ef  Coppercom Inc
 13f0  Sundance Technology Inc
-       0201  Sundance Ethernet
+       0201  ST201 Sundance Ethernet
 13f1  Oce' - Technologies B.V.
 13f2  Ford Microelectronics Inc
 13f3  Mcdata Corporation
-13f4  Troika Design Inc
+13f4  Troika Networks, Inc.
+       1401  Zentai Fibre Channel Adapter
 13f5  Kansai Electric Co. Ltd
 13f6  C-Media Electronics Inc
        0100  CM8338A
        0101  CM8338B
                13f6 0101  CMI8338-031 PCI Audio Device
        0111  CM8738
+               1043 8077  CMI8738 6-channel audio controller
+               1043 80e2  CMI8738 6ch-MX
                13f6 0111  CMI8738/C3DX PCI Audio Device
        0211  CM8738
 13f7  Wildfire Communications
 13fc  Computer Peripherals International
 13fd  Micro Science Inc
 13fe  Advantech Co. Ltd
+       1756  PCI-1756
 13ff  Silicon Spice Inc
 1400  Artx Inc
        1401  9432 TX
        0500  Lava Single Serial
        0600  Lava Port 650
        8000  Lava Parallel
+       8001  Dual parallel port controller A
        8002  Lava Dual Parallel port A
        8003  Lava Dual Parallel port B
        8800  BOCA Research IOPPAR
 1408  Aloka Co. Ltd
 1409  Timedia Technology Co Ltd
+       7168  PCI2S550 (Dual 16550 UART)
 140a  DSP Research Inc
 140b  Ramix Inc
 140c  Elmic Systems Inc
 1413  Addonics
 1414  Microsoft Corporation
 1415  Oxford Semiconductor Ltd
+       8403  VScom 011H-EP1 1 port parallel adaptor
+       9501  OX16PCI954 (Quad 16950 UART) function 0
+               15ed 2000  MCCR Serial p0-3 of 8
+               15ed 2001  MCCR Serial p0-3 of 16
+       950a  EXSYS EX-41092 Dual 16950 Serial adapter
+       950b  OXCB950 Cardbus 16950 UART
+       9511  OX16PCI954 (Quad 16950 UART) function 1
+               15ed 2000  MCCR Serial p4-7 of 8
+               15ed 2001  MCCR Serial p4-15 of 16
+       9521  OX16PCI952 (Dual 16950 UART)
 1416  Multiwave Innovation pte Ltd
 1417  Convergenet Technologies Inc
 1418  Kyushu electronics systems Inc
 14b8  Techsoft Technology Co Ltd
 14b9  AIRONET Wireless Communications
        0001  PC4800
+       0340  PC4800
+       0350  PC4800
+       4500  PC4500
+       4800  PC4800
 14ba  INTERNIX Inc.
 14bb  SEMTECH Corporation
 14bc  Globespan Semiconductor Inc.
 14d0  Ericsson Axe R & D
 14d1  Computer Hi-Tech Co Ltd
 14d2  Titan Electronics Inc
+       8001  VScom 010L 1 port parallel adaptor
+       8002  VScom 020L 2 port parallel adaptor
+       8010  VScom 100L 1 port serial adaptor
+       8011  VScom 110L 1 port serial and 1 port parallel adaptor
+       8020  VScom 200L 1 port serial adaptor
+       8021  VScom 210L 2 port serial and 1 port parallel adaptor
+       8040  VScom 400L 4 port serial adaptor
+       8080  VScom 800L 8 port serial adaptor
+       a000  VScom 010H 1 port parallel adaptor
+       a001  VScom 100H 1 port serial adaptor
+       a003  VScom 400H 4 port serial adaptor
+       a004  VScom 400HF1 4 port serial adaptor
+       a005  VScom 200H 2 port serial adaptor
+       e001  VScom 010HV2 1 port parallel adaptor
+       e010  VScom 100HV2 1 port serial adaptor
+       e020  VScom 200HV2 2 port serial adaptor
 14d3  CIRTECH (UK) Ltd
 14d4  Panacom Technology Corp
 14d5  Nitsuko Corporation
        0007  PCI224
        0008  PCI234
        0009  PCI236
+       000a  PCI272
+       000b  PCI215
 14dd  Boulder Design Labs Inc
 14de  Applied Integration Corporation
 14df  ASIC Communications Corp
 14e1  INVERTEX
 14e2  INFOLIBRIA
 14e3  AMTELCO
-14e4  BROADCOM Corporation
+14e4  Broadcom Corporation
        1644  NetXtreme BCM5700 Gigabit Ethernet
+               1014 0277  Broadcom Vigil B5700 1000BaseTX
+               1028 00d1  Broadcom BCM5700
+               1028 0106  Broadcom BCM5700
+               1028 0109  Broadcom BCM5700 1000BaseTX
+               1028 010a  Broadcom BCM5700 1000BaseTX
                10b7 1000  3C996-T 1000BaseTX
                10b7 1001  3C996B-T 1000BaseTX
                10b7 1002  3C996C-T 1000BaseTX
-               10b7 1003  3C997-T 1000BaseTX
+               10b7 1003  3C997-T 1000BaseTX Dual Port
                10b7 1004  3C996-SX 1000BaseSX
-               10b7 1005  3C997-SX 1000BaseSX
+               10b7 1005  3C997-SX 1000BaseSX Dual Port
+               10b7 1008  3C942 Gigabit LOM (31X31)
                14e4 0002  NetXtreme 1000BaseSX
                14e4 0003  NetXtreme 1000BaseSX
                14e4 0004  NetXtreme 1000BaseTX
-               14e4 1644  NetXtreme BCM5700 1000BaseTX
+               14e4 1028  NetXtreme 1000BaseTX
+               14e4 1644  BCM5700 1000BaseTX
        1645  NetXtreme BCM5701 Gigabit Ethernet
-               0e11 007c  NC7770 1000BaseTX
-               0e11 007d  NC6770 1000BaseSX
-               0e11 0085  NC7780 1000BaseTX
+               0e11 007c  NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+               0e11 007d  NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+               0e11 0085  NC7780 Gigabit Server Adapter (embedded, WOL)
+               0e11 0099  NC7780 Gigabit Server Adapter (embedded, WOL)
+               0e11 009a  NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+               1028 0121  Broadcom BCM5701 1000BaseTX
                10b7 1004  3C996-SX 1000BaseSX
                10b7 1006  3C996B-T 1000BaseTX
                10b7 1007  3C1000-T 1000BaseTX
                10b7 1008  3C940-BR01 1000BaseTX
-               14e4 0001  NetXtreme BCM5701 1000BaseTX
-               14e4 0005  NetXtreme BCM5701 1000BaseTX
-               14e4 0006  NetXtreme BCM5701 1000BaseTX
-               14e4 0007  NetXtreme BCM5701 1000BaseSX
-               14e4 0008  NetXtreme BCM5701 1000BaseTX
-               14e4 8008  NetXtreme BCM5701 1000BaseTX
+               14e4 0001  BCM5701 1000BaseTX
+               14e4 0005  BCM5701 1000BaseTX
+               14e4 0006  BCM5701 1000BaseTX
+               14e4 0007  BCM5701 1000BaseSX
+               14e4 0008  BCM5701 1000BaseTX
+               14e4 8008  BCM5701 1000BaseTX
+       1646  NetXtreme BCM5702 Gigabit Ethernet
+               0e11 00bb  NC7760 1000BaseTX
+               1028 0126  Broadcom BCM5702 1000BaseTX
+               14e4 8009  BCM5702 1000BaseTX
        1647  NetXtreme BCM5703 Gigabit Ethernet
+               0e11 0099  NC7780 1000BaseTX
+               0e11 009a  NC7770 1000BaseTX
+               14e4 0009  BCM5703 1000BaseTX
+               14e4 000a  BCM5703 1000BaseSX
+               14e4 000b  BCM5703 1000BaseTX
+               14e4 8009  BCM5703 1000BaseTX
+               14e4 800a  BCM5703 1000BaseTX
+       1648  NetXtreme BCM5704 Gigabit Ethernet
+       164d  NetXtreme BCM5702FE Gigabit Ethernet
+       16a6  NetXtreme BCM5702X Gigabit Ethernet
+       16a7  NetXtreme BCM5703X Gigabit Ethernet
+       4212  BCM v.90 56k modem
        5820  BCM5820 Crypto Accelerator
+       5821  BCM5821 Crypto Accelerator
 14e5  Pixelfusion Ltd
 14e6  SHINING Technology Inc
 14e7  3CX
 14e8  RAYCER Inc
 14e9  GARNETS System CO Ltd
-14ea  PLANEX COMMUNICATIONS Inc
+14ea  Planex Communications, Inc
+       ab06  FNW-3603-TX CardBus Fast Ethernet
 14eb  SEIKO EPSON Corp
 14ec  ACQIRIS
 14ed  DATAKINETICS Ltd
 14ef  CARRY Computer ENG. CO Ltd
 14f0  CANON RESEACH CENTRE FRANCE
 14f1  Conexant
+       1002  HCF 56k Modem
+       1003  HCF 56k Modem
+       1004  HCF 56k Modem
+       1005  HCF 56k Modem
+       1006  HCF 56k Modem
+       1022  HCF 56k Modem
+       1023  HCF 56k Modem
+       1024  HCF 56k Modem
+       1025  HCF 56k Modem
+       1026  HCF 56k Modem
+       1032  HCF 56k Modem
        1033  HCF 56k Data/Fax Modem
+               1033 8077  NEC
                122d 4027  Dell Zeus - MDP3880-W(B) Data Fax Modem
                122d 4030  Dell Mercury - MDP3880-U(B) Data Fax Modem
                122d 4034  Dell Thor - MDP3880-W(U) Data Fax Modem
                13e0 020d  Dell Copper
                13e0 020e  Dell Silver
+               13e0 0261  IBM
                13e0 0290  Compaq Goldwing
+               13e0 02a0  IBM
+               13e0 02b0  IBM
                13e0 02c0  Compaq Scooter
+               13e0 02d0  IBM
                144f 1500  IBM P85-DF (1)
                144f 1501  IBM P85-DF (2)
                144f 150a  IBM P85-DF (3)
        1035  HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
                10cf 1098  Fujitsu P85-DFSV
        1036  HCF 56k Data/Fax/Voice/Spkp Modem
+               104d 8067  HCF 56k Modem
                122d 4029  MDP3880SP-W
                122d 4031  MDP3880SP-U
                13e0 0209  Dell Titanium
        1435  HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
        1436  HCF 56k Data/Fax Modem
        1453  HCF 56k Data/Fax Modem
+               13e0 0240  IBM
+               13e0 0250  IBM
                144f 1502  IBM P95-DF (1)
                144f 1503  IBM P95-DF (2)
        1454  HCF 56k Data/Fax/Voice Modem
        1456  HCF 56k Data/Fax/Voice/Spkp Modem
                122d 4035  Dell Europa - MDP3900V-W
                122d 4302  Dell MP3930V-W(C) MiniPCI
+       1610  ADSL AccessRunner PCI Arbitration Device
+       1611  AccessRunner PCI ADSL Interface Device
        1803  HCF 56k Modem
                0e11 0023  623-LAN Grizzly
                0e11 0043  623-LAN Yogi
                0e11 b195  Bear
                0e11 b196  Seminole 1
                0e11 b1be  Seminole 2
+               1025 8013  Acer
+               1033 809d  NEC
+               1033 80bc  NEC
                155d 6793  HP
                155d 8850  E Machines
        2014  HSF 56k Data/Fax/Voice Modem
        2365  HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
        2366  HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
        2443  HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
+               104d 8075  Modem
+               104d 8083  Modem
+               104d 8097  Modem
        2444  HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
        2445  HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
        2446  HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
        2f00  HSF 56k HSFi Modem
                13e0 8d84  IBM HSFi V.90
                13e0 8d85  Compaq Stinger
+               14f1 2004  Dynalink 56PMi
+       8234  RS8234 ATM SAR Controller [ServiceSAR Plus]
 14f2  MOBILITY Electronics
 14f3  BROADLOGIC
 14f4  TOKYO Electronic Industry CO Ltd
 1514  TFL LAN Inc
 1515  Advent design
 1516  MYSON Technology Inc
+       0803  SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+               1320 10bd  SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
 1517  ECHOTEK Corp
 1518  PEP MODULAR Computers GmbH
 1519  TELEFON AKTIEBOLAGET LM Ericsson
 151d  Fujitsu Computer Products Of America
 151e  MATRIX Corp
 151f  TOPIC SEMICONDUCTOR Corp
+       0000  TP560 Data/Fax/Voice 56k modem
 1520  CHAPLET System Inc
 1521  BELL Corp
 1522  MainPine Ltd
+       0100  PCI <-> IOBus Bridge
+               1522 0200  RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem
+               1522 0300  RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem
+               1522 0400  RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem
+               1522 0500  RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem
+               1522 0600  RockForce+ 2 Port V.90 Data/Fax/Voice Modem
 1523  MUSIC Semiconductors
 1524  ENE Technology Inc
 1525  IMPACT Technologies
 15a0  Compumaster SRL
 15a1  Geocast Network Systems
 15a2  Catalyst Enterprises Inc
+       0001  TA700 PCI Bus Analyzer/Exerciser
 15a3  Italtel
 15a4  X-Net OY
 15a5  Toyota Macs Inc
 15b1  Source Technology Inc
 15b2  Mosaid Technologies Inc
 15b3  Mellanox Technology
+       5274  MT21108 InfiniBridge
 15b4  CCI/TRIAD
 15b5  Cimetrics Inc
 15b6  Texas Memory Systems Inc
 15ba  Impacct Technology Corp
 15bb  Portwell Inc
 15bc  Agilent Technologies
+       2929  E2929A PCI/PCI-X Bus Analyzer
 15bd  DFI Inc
 15be  Sola Electronics
 15bf  High Tech Computer Corp (HTC)
 15c4  EVSX Inc
 15c5  Procomp Informatics Ltd
 15c6  Technical University of Budapest
-15c7  Tateyama Dystem Laboratory Co Ltd
+15c7  Tateyama System Laboratory Co Ltd
+       0349  Tateyama C-PCI PLC/NC card Rev.01A
 15c8  Penta Media Co Ltd
 15c9  Serome Technology Inc
 15ca  Bitboys OY
 15e6  Agere Inc
 15e7  Get Engineering Corp
 15e8  National Datacomm Corp
+       0130  Wireless PCI Card
 15e9  Pacific Digital Corp
 15ea  Tokyo Denshi Sekei K.K.
 15eb  Drsearch GmbH
 1619  FarSite Communications Ltd
        0400  FarSync T2P (2 port X.21/V.35/V.24)
        0440  FarSync T4P (4 port X.21/V.35/V.24)
+1629  Kongsberg Spacetec AS
+       1003  Format synchronizer v3.0
+       2002  Fast Universal Data Output
+1638  Standard Microsystems Corp [SMC]
+       1100  SMC2602W EZConnect / Addtron AWA-100
+1657  Brocade Communications Systems, Inc.
+165d  Hsing Tech. Enterprise Co., Ltd.
+1661  Worldspace Corp.
 1668  Action Tec Electronics Inc
+16ec  U.S. Robotics
+       3685  Wireless Access PCI Adapter Model 022415
+16f6  VideoTele.com, Inc.
+170b  NetOctave Inc
+170c  YottaYotta Inc.
+173b  Altima (nee Broadcom)
+       03e8  AC1000 Gigabit Ethernet
+       03ea  AC9100 Gigabit Ethernet
+1743  Peppercon AG
+       8139  ROL/F-100 Fast Ethernet Adapter with ROL
+174b  PC Partner Limited
+175e  Sanera Systems, Inc.
+# also used by Struck Innovative Systeme for joint developments
+1796  Research Centre Juelich
+       0001  SIS1100 [Gigabit link]
+       0002  HOTlink
+       0003  Counter Timer
+       0004  CAMAC Controller
+       0005  PROFIBUS
+       0006  AMCC HOTlink
 1813  Ambient Technologies Inc
 1a08  Sierra semiconductor
        0000  SC15064
 3000  Hansol Electronics Inc.
 3142  Post Impression Systems.
 3388  Hint Corp
+       0021  HB1-SE33 PCI-PCI Bridge
        8011  VXPro II Chipset
                3388 8011  VXPro II Chipset CPU to PCI Bridge
        8012  VXPro II Chipset
                3388 8012  VXPro II Chipset PCI to ISA Bridge
-       8013  VXPro II Chipset
+       8013  VXPro II IDE
                3388 8013  VXPro II Chipset EIDE Controller
 3411  Quantum Designs (H.K.) Inc
 3513  ARCOM Control Systems Ltd
        0007  3D Extreme
        0008  GLINT Gamma G1
        0009  Permedia II 2D+3D
+               1040 0011  AccelStar II
                3d3d 0100  AccelStar II 3D Accelerator
                3d3d 0111  Permedia 3:16
                3d3d 0114  Santa Ana
        2501  ALG-2564A/25128A
        4000  ALS4000 Audio Chipset
                4005 4000  ALS4000 Audio Chipset
+       4710  ALC200/200P
 4033  Addtron Technology Co, Inc.
        1360  RTL8139 Ethernet
 4143  Digital Equipment Corp
                4a14 5000  RT8029-Based Ethernet Adapter
 4b10  Buslogic Inc.
 4c48  LUNG HWA Electronics
+4c53  SBS Technologies
 4ca1  Seanix Technology Inc
 4d51  MediaQ Inc.
        0200  MQ-200
 4d54  Microtechnica Co Ltd
 4ddc  ILC Data Device Corp
+       0100  DD-42924I5-300 (ARINC 429 Data Bus)
+       0801  BU-65570I1 MIL-STD-1553 Test and Simulation
+       0802  BU-65570I2 MIL-STD-1553 Test and Simulation
+       0811  BU-65572I1 MIL-STD-1553 Test and Simulation
+       0812  BU-65572I2 MIL-STD-1553 Test and Simulation
+       0881  BU-65570T1 MIL-STD-1553 Test and Simulation
+       0882  BU-65570T2 MIL-STD-1553 Test and Simulation
+       0891  BU-65572T1 MIL-STD-1553 Test and Simulation
+       0892  BU-65572T2 MIL-STD-1553 Test and Simulation
+       0901  BU-65565C1 MIL-STD-1553 Data Bus
+       0902  BU-65565C2 MIL-STD-1553 Data Bus
+       0903  BU-65565C3 MIL-STD-1553 Data Bus
+       0904  BU-65565C4 MIL-STD-1553 Data Bus
+       0b01  BU-65569I1 MIL-STD-1553 Data Bus
+       0b02  BU-65569I2 MIL-STD-1553 Data Bus
+       0b03  BU-65569I3 MIL-STD-1553 Data Bus
+       0b04  BU-65569I4 MIL-STD-1553 Data Bus
+5046  GemTek Technology Corporation
+       1001  PCI Radio
 5053  Voyetra Technologies
        2010  Daytona Audio Adapter
 5136  S S Technologies
        88f3  86c968 [Vision 968 VRAM] rev 3
        8900  86c755 [Trio 64V2/DX]
                5333 8900  86C775 Trio64V2/DX
-       8901  Trio 64V2/DX or /GX
+       8901  86c775/86c785 [Trio 64V2/DX or /GX]
                5333 8901  86C775 Trio64V2/DX, 86C785 Trio64V2/GX
        8902  Plato/PX
        8903  Trio 3D business multimedia
                5333 8a13  Trio3D/2X
        8a20  86c794 [Savage 3D]
                5333 8a20  86C391 Savage3D
-       8a21  86c795 [Savage 3D/MV]
+       8a21  86c390 [Savage 3D/MV]
                5333 8a21  86C390 Savage3D/MV
        8a22  Savage 4
+               1033 8068  Savage 4
+               1033 8069  Savage 4
                105d 0018  SR9 8Mb SDRAM
                105d 002a  SR9 Pro 16Mb SDRAM
                105d 003a  SR9 Pro 32Mb SDRAM
        8a26  ProSavage KM133
        8c00  ViRGE/M3
        8c01  ViRGE/MX
+               1179 0001  ViRGE/MX
        8c02  ViRGE/MX+
        8c03  ViRGE/MX+MV
        8c10  86C270-294 Savage/MX-MV
        8c11  82C270-294 Savage/MX
        8c12  86C270-294 Savage/IX-MV
        8c13  86C270-294 Savage/IX
+       8c22  SuperSavage MX/128
+       8c24  SuperSavage MX/64
+       8c26  SuperSavage MX/64C
+       8c2a  SuperSavage IX/128 SDR
+       8c2b  SuperSavage IX/128 DDR
+       8c2c  SuperSavage IX/64 SDR
+       8c2d  SuperSavage IX/64 DDR
+       8c2e  SuperSavage IX/C SDR
+               1014 01fc  ThinkPad T23 (2647-4MG)
+       8c2f  SuperSavage IX/C DDR
+# Integrated in VIA ProSavage PN133 North Bridge
+       8d01  VT8603 [ProSavage PN133] AGP4X VGA Controller (Twister)
+       8d02  VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)
+       8d04  VT8751 [ProSavageDDR P4M266] VGA Controller
        9102  86C410 Savage 2000
                1092 5932  Viper II Z200
                1092 5934  Viper II Z200
        0011  PWDOG2 [PCI-Watchdog 2]
 8086  Intel Corp.
        0007  82379AB
+       0008  Extended Express System Support Controller
        0039  21145
        0122  82437FX
        0482  82375EB
        04d0  82437FX [Triton FX]
        0600  RAID Controller
        0960  80960RP [i960 RP Microprocessor/Bridge]
+       0962  80960RM [i960RM Bridge]
        0964  80960RP [i960 RP Microprocessor/Bridge]
        1000  82542 Gigabit Ethernet Controller
-               0e11 b0df  NC1632 Gigabit Ethernet Adapter
-               0e11 b0e0  NC1633 Gigabit Ethernet Adapter
-               0e11 b123  NC1634 Gigabit Ethernet Adapter
+               0e11 b0df  NC1632 Gigabit Ethernet Adapter (1000-SX)
+               0e11 b0e0  NC1633 Gigabit Ethernet Adapter (1000-LX)
+               0e11 b123  NC1634 Gigabit Ethernet Adapter (1000-SX)
                1014 0119  Netfinity Gigabit Ethernet SX Adapter
+               8086 1000  PRO/1000 Gigabit Server Adapter
        1001  82543GC Gigabit Ethernet Controller
+               0e11 004a  NC6136 Gigabit Server Adapter
+               1014 01ea  Netfinity Gigabit Ethernet SX Adapter
+               8086 1003  PRO/1000 F Server Adapter
+       1002  Pro 100 LAN+Modem 56 Cardbus II
+               8086 200e  Pro 100 LAN+Modem 56 Cardbus II
+               8086 2013  Pro 100 SR Mobile Combo Adapter
+               8086 2017  Pro 100 S Combo Mobile Adapter
        1004  82543GC Gigabit Ethernet Controller
+               0e11 0049  NC7132 Gigabit Upgrade Module
+               0e11 b1a4  NC7131 Gigabit Server Adapter
+               1014 10f2  Gigabit Ethernet Server Adapter
+               8086 1004  PRO/1000 T Server Adapter
+               8086 2004  PRO/1000 T Server Adapter
        1008  82544EI Gigabit Ethernet Controller
+               8086 1107  PRO/1000 XT Server Adapter
+               8086 2107  PRO/1000 XT Server Adapter
+               8086 2110  PRO/1000 XT Server Adapter
        1009  82544EI Gigabit Ethernet Controller
+               8086 1109  PRO/1000 XF Server Adapter
+               8086 2109  PRO/1000 XF Server Adapter
        100c  82544GC Gigabit Ethernet Controller
+               8086 1112  PRO/1000 T Desktop Adapter
+               8086 2112  PRO/1000 T Desktop Adapter
        100d  82544GC Gigabit Ethernet Controller
+       100e  82540EM Gigabit Ethernet Controller
+               8086 001e  PRO/1000 MT Desktop Adapter
+               8086 002e  PRO/1000 MT Desktop Adapter
+       100f  82545EM Gigabit Ethernet Controller
+               8086 1001  PRO/1000 MT Server Adapter
+       1010  82546EB Gigabit Ethernet Controller
+               8086 1011  PRO/1000 MT Dual Port Server Adapter
+       1011  82545EM Gigabit Ethernet Controller
+               8086 1002  PRO/1000 MF Server Adapter
+       1012  82546EB Gigabit Ethernet Controller
+               8086 1012  PRO/1000 MF Dual Port Server Adapter
        1029  82559 Ethernet Controller
        1030  82559 InBusiness 10/100
-       1031  82801CAM (ICH3) Chipset Ethernet Controller
-       1032  82801CAM (ICH3) Chipset Ethernet Controller
-       1033  82801CAM (ICH3) Chipset Ethernet Controller
-       1034  82801CAM (ICH3) Chipset Ethernet Controller
-       1035  82801CAM (ICH3) Chipset Ethernet Controller
-       1036  82801CAM (ICH3) Chipset Ethernet Controller
+       1031  82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller
+               1014 0209  ThinkPad A30p (2653-64G)
+               104d 80e7  Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+               107b 5350  EtherExpress PRO/100 VE
+               1179 0001  EtherExpress PRO/100 VE
+               144d c000  EtherExpress PRO/100 VE
+               144d c001  EtherExpress PRO/100 VE
+               144d c003  EtherExpress PRO/100 VE
+       1032  82801CAM (ICH3) PRO/100 VE Ethernet Controller
+       1033  82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller
+       1034  82801CAM (ICH3) PRO/100 VM Ethernet Controller
+       1035  82801CAM (ICH3)/82562EH (LOM)  Ethernet Controller
+       1036  82801CAM (ICH3) 82562EH Ethernet Controller
        1037  82801CAM (ICH3) Chipset Ethernet Controller
-       1038  82801CAM (ICH3) Chipset Ethernet Controller
+       1038  82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller
+       1039  82801BD PRO/100 VE (LOM) Ethernet Controller
+       103a  82801BD PRO/100 VE (CNR) Ethernet Controller
+       103b  82801BD PRO/100 VM (LOM) Ethernet Controller
+       103c  82801BD PRO/100 VM (CNR) Ethernet Controller
+       103d  82801BD PRO/100 VE (MOB) Ethernet Controller
+       103e  82801BD PRO/100 VM (MOB) Ethernet Controller
+       1059  82551QM Ethernet Controller
        1130  82815 815 Chipset Host Bridge and Memory Controller Hub
+               1043 8027  TUSL2-C Mainboard
+               104d 80df  Vaio PCG-FX403
+       1131  82815 815 Chipset AGP Bridge
        1132  82815 CGC [Chipset Graphics Controller]
+               1025 1016  Travelmate 612 TX
+               104d 80df  Vaio PCG-FX403
        1161  82806AA PCI64 Hub Advanced Programmable Interrupt Controller
+               8086 1161  82806AA PCI64 Hub APIC
+       1200  Intel IXP1200 Network Processor
+               172a 0000  AEP SSL Accelerator
        1209  82559ER
        1221  82092AA_0
        1222  82092AA_1
        1226  82596 PRO/10 PCI
        1227  82865 EtherExpress PRO/100A
        1228  82556 EtherExpress PRO/100 Smart
-       1229  82557 [Ethernet Pro 100]
-               0e11 b01e  NC3120
-               0e11 b01f  NC3122
-               0e11 b02f  NC1120
+# the revision field differentiates between them (1-3 is 82557, 4-5 is 82558, 6-8 is 82559, 9 is 82559ER)
+       1229  82557/8/9 [Ethernet Pro 100]
+               0e11 3001  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3002  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3003  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3004  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3005  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3006  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 3007  82559 Fast Ethernet LOM with Alert on LAN*
+               0e11 b01e  NC3120 Fast Ethernet NIC
+               0e11 b01f  NC3122 Fast Ethernet NIC (dual port)
+               0e11 b02f  NC1120 Ethernet NIC
                0e11 b04a  Netelligent 10/100TX NIC with Wake on LAN
-               0e11 b0c6  Embedded NC3120 with Wake on LAN
-               0e11 b0c7  Embedded NC3121
-               0e11 b0d7  NC3121 with Wake on LAN
-               0e11 b0dd  NC3131 (82558B)
-               0e11 b0de  NC3132
-               0e11 b0e1  NC3133
-               0e11 b144  NC3123 (82559)
+               0e11 b0c6  NC3161 Fast Ethernet NIC (embedded, WOL)
+               0e11 b0c7  NC3160 Fast Ethernet NIC (embedded)
+               0e11 b0d7  NC3121 Fast Ethernet NIC (WOL)
+               0e11 b0dd  NC3131 Fast Ethernet NIC (dual port)
+               0e11 b0de  NC3132 Fast Ethernet Module (dual port)
+               0e11 b0e1  NC3133 Fast Ethernet Module (100-FX)
+               0e11 b134  NC3163 Fast Ethernet NIC (embedded, WOL)
+               0e11 b13c  NC3162 Fast Ethernet NIC (embedded)
+               0e11 b144  NC3123 Fast Ethernet NIC (WOL)
+               0e11 b163  NC3134 Fast Ethernet NIC (dual port)
+               0e11 b164  NC3135 Fast Ethernet Upgrade Module (dual port)
+               0e11 b1a4  NC7131 Gigabit Server Adapter
                1014 005c  82558B Ethernet Pro 10/100
+               1014 01bc  82559 Fast Ethernet LAN On Motherboard
+               1014 01f1  10/100 Ethernet Server Adapter
+               1014 01f2  10/100 Ethernet Server Adapter
+               1014 0207  Ethernet Pro/100 S
+               1014 0232  10/100 Dual Port Server Adapter
                1014 105c  Netfinity 10/100
+               1014 305c  10/100 EtherJet Management Adapter
+               1014 405c  10/100 EtherJet Adapter with Alert on LAN
+               1014 505c  10/100 EtherJet Secure Management Adapter
+               1014 605c  10/100 EtherJet Secure Management Adapter
+               1014 705c  10/100 Netfinity 10/100 Ethernet Security Adapter
+               1014 805c  10/100 Netfinity 10/100 Ethernet Security Adapter
                1033 8000  PC-9821X-B06
                1033 8016  PK-UG-X006
                1033 801f  PK-UG-X006
-               103c 10c0  Ethernet Pro 10/100TX
-               103c 10c3  Ethernet Pro 10/100TX
-               103c 1200  Ethernet Pro 10/100TX
+               1033 8026  PK-UG-X006
+               1033 8063  82559-based Fast Ethernet Adapter
+               1033 8064  82559-based Fast Ethernet Adapter
+               103c 10c0  NetServer 10/100TX
+               103c 10c3  NetServer 10/100TX
+               103c 10ca  NetServer 10/100TX
+               103c 10cb  NetServer 10/100TX
+               103c 10e3  NetServer 10/100TX
+               103c 10e4  NetServer 10/100TX
+               103c 1200  NetServer 10/100TX
                10c3 1100  SmartEther100 SC1100
+               10cf 1115  8255x-based Ethernet Adapter (10/100)
+               10cf 1143  8255x-based Ethernet Adapter (10/100)
+               1179 0001  8255x-based Ethernet Adapter (10/100)
                1179 0002  PCI FastEther LAN on Docker
+               1179 0003  8255x-based Fast Ethernet
                1259 2560  AT-2560 100
                1259 2561  AT-2560 100 FX Ethernet Adapter
                1266 0001  NE10/100 Adapter
+               144d 2501  SEM-2000 MiniPCI LAN Adapter
+               144d 2502  SEM-2100IL MiniPCI LAN Adapter
+               1668 1100  EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)
                8086 0001  EtherExpress PRO/100B (TX)
                8086 0002  EtherExpress PRO/100B (T4)
                8086 0003  EtherExpress PRO/10+
                8086 000c  EtherExpress PRO/100+ Management Adapter
                8086 000d  EtherExpress PRO/100+ Alert On LAN II* Adapter
                8086 000e  EtherExpress PRO/100+ Management Adapter with Alert On LAN*
+               8086 000f  EtherExpress PRO/100 Desktop Adapter
+               8086 0010  EtherExpress PRO/100 S Management Adapter
+               8086 0011  EtherExpress PRO/100 S Management Adapter
+               8086 0012  EtherExpress PRO/100 S Advanced Management Adapter (D)
+               8086 0013  EtherExpress PRO/100 S Advanced Management Adapter (E)
+               8086 0030  EtherExpress PRO/100  Management Adapter with Alert On LAN* GC
+               8086 0031  EtherExpress PRO/100 Desktop Adapter
+               8086 0040  EtherExpress PRO/100 S Desktop Adapter
+               8086 0041  EtherExpress PRO/100 S Desktop Adapter
+               8086 0042  EtherExpress PRO/100 Desktop Adapter
+               8086 0050  EtherExpress PRO/100 S Desktop Adapter
                8086 1009  EtherExpress PRO/100+ Server Adapter
                8086 100c  EtherExpress PRO/100+ Server Adapter (PILA8470B)
+               8086 1012  EtherExpress PRO/100 S Server Adapter (D)
+               8086 1013  EtherExpress PRO/100 S Server Adapter (E)
+               8086 1015  EtherExpress PRO/100 S Dual Port Server Adapter
+               8086 1017  EtherExpress PRO/100+ Dual Port Server Adapter
+               8086 1030  EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server
+               8086 1040  EtherExpress PRO/100 S Server Adapter
+               8086 1041  EtherExpress PRO/100 S Server Adapter
+               8086 1042  EtherExpress PRO/100 Server Adapter
+               8086 1050  EtherExpress PRO/100 S Server Adapter
+               8086 1051  EtherExpress PRO/100 Server Adapter
+               8086 1052  EtherExpress PRO/100 Server Adapter
                8086 10f0  EtherExpress PRO/100+ Dual Port Adapter
+               8086 2009  EtherExpress PRO/100 S Mobile Adapter
                8086 200d  EtherExpress PRO/100 Cardbus
                8086 200e  EtherExpress PRO/100 LAN+V90 Cardbus Modem
+               8086 200f  EtherExpress PRO/100 SR Mobile Adapter
+               8086 2010  EtherExpress PRO/100 S Mobile Combo Adapter
+               8086 2013  EtherExpress PRO/100 SR Mobile Combo Adapter
+               8086 2016  EtherExpress PRO/100 S Mobile Adapter
+               8086 2017  EtherExpress PRO/100 S Combo Mobile Adapter
+               8086 2018  EtherExpress PRO/100 SR Mobile Adapter
+               8086 2019  EtherExpress PRO/100 SR Combo Mobile Adapter
+               8086 2101  EtherExpress PRO/100 P Mobile Adapter
+               8086 2102  EtherExpress PRO/100 SP Mobile Adapter
+               8086 2103  EtherExpress PRO/100 SP Mobile Adapter
+               8086 2104  EtherExpress PRO/100 SP Mobile Adapter
+               8086 2105  EtherExpress PRO/100 SP Mobile Adapter
+               8086 2106  EtherExpress PRO/100 P Mobile Adapter
+               8086 2107  EtherExpress PRO/100 Network Connection
+               8086 2108  EtherExpress PRO/100 Network Connection
+               8086 2200  EtherExpress PRO/100 P Mobile Combo Adapter
+               8086 2201  EtherExpress PRO/100 P Mobile Combo Adapter
+               8086 2202  EtherExpress PRO/100 SP Mobile Combo Adapter
+               8086 2203  EtherExpress PRO/100+ MiniPCI
+               8086 2204  EtherExpress PRO/100+ MiniPCI
+               8086 2205  EtherExpress PRO/100 SP Mobile Combo Adapter
+               8086 2206  EtherExpress PRO/100 SP Mobile Combo Adapter
+               8086 2207  EtherExpress PRO/100 SP Mobile Combo Adapter
+               8086 2208  EtherExpress PRO/100 P Mobile Combo Adapter
+               8086 2402  EtherExpress PRO/100+ MiniPCI
+               8086 2407  EtherExpress PRO/100+ MiniPCI
+               8086 2408  EtherExpress PRO/100+ MiniPCI
+               8086 2409  EtherExpress PRO/100+ MiniPCI
+               8086 240f  EtherExpress PRO/100+ MiniPCI
+               8086 2410  EtherExpress PRO/100+ MiniPCI
+               8086 2411  EtherExpress PRO/100+ MiniPCI
+               8086 2412  EtherExpress PRO/100+ MiniPCI
+               8086 2413  EtherExpress PRO/100+ MiniPCI
                8086 3000  82559 Fast Ethernet LAN on Motherboard
                8086 3001  82559 Fast Ethernet LOM with Basic Alert on LAN*
                8086 3002  82559 Fast Ethernet LOM with Alert on LAN II*
+               8086 3006  EtherExpress PRO/100 S Network Connection
+               8086 3007  EtherExpress PRO/100 S Network Connection
+               8086 3008  EtherExpress PRO/100 Network Connection
+               8086 3010  EtherExpress PRO/100 S Network Connection
+               8086 3011  EtherExpress PRO/100 S Network Connection
+               8086 3012  EtherExpress PRO/100 Network Connection
        122d  430FX - 82437FX TSC [Triton I]
        122e  82371FB PIIX ISA [Triton I]
        1230  82371FB PIIX IDE [Triton I]
        123b  82380PB
        123c  82380AB
        123d  683053 Programmable Interrupt Device
+       123f  82466GX Integrated Hot-Plug Controller (IHPC)
        1240  752 AGP
        124b  82380FB
        1250  430HX - 82439HX TXC [Triton II]
        1360  82806AA PCI64 Hub PCI Bridge
        1361  82806AA PCI64 Hub Controller (HRes)
+               8086 1361  82806AA PCI64 Hub Controller (HRes)
+               8086 8000  82806AA PCI64 Hub Controller (HRes)
+       1460  82870P2 P64H2 Hub PCI Bridge
+       1461  82870P2 P64H2 I/OxAPIC
+       1462  82870P2 P64H2 Hot Plug Controller
        1960  80960RP [i960RP Microprocessor]
-               101e 0438  MegaRaid 438
-               101e 0466  MegaRaid 466
-               101e 0467  MegaRaid 467
+               101e 0431  MegaRAID 431 RAID Controller
+               101e 0438  MegaRAID 438 Ultra2 LVD RAID Controller
+               101e 0466  MegaRAID 466 Express Plus RAID Controller
+               101e 0467  MegaRAID 467 Enterprise 1500 RAID Controller
+               101e 0490  MegaRAID 490 Express 300 RAID Controller
+               101e 0762  MegaRAID 762 Express RAID Controller
                101e 09a0  PowerEdge Expandable RAID Controller 2/SC
                1028 0467  PowerEdge Expandable RAID Controller 2/DC
                1028 1111  PowerEdge Expandable RAID Controller 2/SC
-               103c 03a2  MegaRaid
-               103c 10c6  MegaRaid 438
-               103c 10c7  MegaRaid T5
-               103c 10cc  MegaRaid
-               1111 1111  MegaRaid 466
-               113c 03a2  MegaRaid
+               103c 03a2  MegaRAID
+               103c 10c6  MegaRAID 438, HP NetRAID-3Si
+               103c 10c7  MegaRAID T5, Integrated HP NetRAID
+               103c 10cc  MegaRAID, Integrated HP NetRAID
+               103c 10cd  HP NetRAID-1Si
+               105a 0000  SuperTrak
+               105a 2168  SuperTrak Pro
+               105a 5168  SuperTrak66/100
+               1111 1111  MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC
+               1111 1112  PowerEdge Expandable RAID Controller 2/SC
+               113c 03a2  MegaRAID
+       1962  80960RM [i960RM Microprocessor]
+               105a 0000  SuperTrak SX6000 I2O CPU
        1a21  82840 840 (Carmel) Chipset Host Bridge (Hub A)
        1a23  82840 840 (Carmel) Chipset AGP Bridge
        1a24  82840 840 (Carmel) Chipset PCI Bridge (Hub B)
        2412  82801AA USB
        2413  82801AA SMBus
        2415  82801AA AC'97 Audio
+               1028 0095  Precision Workstation 220 Integrated Digital Audio
                11d4 0040  SoundMAX Integrated Digital Audio
                11d4 0048  SoundMAX Integrated Digital Audio
                11d4 5340  SoundMAX Integrated Digital Audio
                11d4 0048  SoundMAX Integrated Digital Audio
        2426  82801AB AC'97 Modem
        2428  82801AB PCI Bridge
-       2440  82820 820 (Camino 2) Chipset ISA Bridge (ICH2)
-       2442  82820 820 (Camino 2) Chipset USB (Hub A)
-       2443  82820 820 (Camino 2) Chipset SMBus
-       2444  82820 820 (Camino 2) Chipset USB (Hub B)
-       2445  82820 820 (Camino 2) Chipset AC'97 Audio Controller
-       2446  82820 820 (Camino 2) Chipset AC'97 Modem Controller
-       2448  82820 820 (Camino 2) Chipset PCI (-M)
-       2449  82820 (ICH2) Chipset Ethernet Controller
-       244a  82820 820 (Camino 2) Chipset IDE U100 (-M)
-       244b  82820 820 (Camino 2) Chipset IDE U100
-       244c  82820 820 (Camino 2) Chipset ISA Bridge (ICH2-M)
-       244e  82820 820 (Camino 2) Chipset PCI
-       2485  AC'97 Audio Controller
+       2440  82801BA ISA Bridge (LPC)
+       2442  82801BA/BAM USB (Hub #1)
+               104d 80df  Vaio PCG-FX403
+               147b 0507  TH7II-RAID
+       2443  82801BA/BAM SMBus
+               1043 8027  TUSL2-C Mainboard
+               104d 80df  Vaio PCG-FX403
+               147b 0507  TH7II-RAID
+       2444  82801BA/BAM USB (Hub #2)
+               104d 80df  Vaio PCG-FX403
+               147b 0507  TH7II-RAID
+       2445  82801BA/BAM AC'97 Audio
+               104d 80df  Vaio PCG-FX403
+               1462 3370  STAC9721 AC
+               147b 0507  TH7II-RAID
+       2446  82801BA/BAM AC'97 Modem
+               104d 80df  Vaio PCG-FX403
+       2448  82801BAM/CAM PCI Bridge
+       2449  82801BA/BAM/CA/CAM Ethernet Controller
+               0e11 0012  EtherExpress PRO/100 VM
+               0e11 0091  EtherExpress PRO/100 VE
+               1014 01ce  EtherExpress PRO/100 VE
+               1014 01dc  EtherExpress PRO/100 VE
+               1014 01eb  EtherExpress PRO/100 VE
+               1014 01ec  EtherExpress PRO/100 VE
+               1014 0202  EtherExpress PRO/100 VE
+               1014 0205  EtherExpress PRO/100 VE
+               1014 0217  EtherExpress PRO/100 VE
+               1014 0234  EtherExpress PRO/100 VE
+               1014 023d  EtherExpress PRO/100 VE
+               1014 0244  EtherExpress PRO/100 VE
+               1014 0245  EtherExpress PRO/100 VE
+               109f 315d  EtherExpress PRO/100 VE
+               109f 3181  EtherExpress PRO/100 VE
+               1186 7801  EtherExpress PRO/100 VE
+               144d 2602  HomePNA 1M CNR
+               8086 3010  EtherExpress PRO/100 VE
+               8086 3011  EtherExpress PRO/100 VM
+               8086 3012  82562EH based Phoneline
+               8086 3013  EtherExpress PRO/100 VE
+               8086 3014  EtherExpress PRO/100 VM
+               8086 3015  82562EH based Phoneline
+               8086 3016  EtherExpress PRO/100 P Mobile Combo
+               8086 3017  EtherExpress PRO/100 P Mobile
+               8086 3018  EtherExpress PRO/100
+       244a  82801BAM IDE U100
+               1025 1016  Travelmate 612TX
+               104d 80df  Vaio PCG-FX403
+       244b  82801BA IDE U100
+               1043 8027  TUSL2-C Mainboard
+               147b 0507  TH7II-RAID
+       244c  82801BAM ISA Bridge (LPC)
+       244e  82801BA/CA/DB PCI Bridge
+       2450  82801E ISA Bridge (LPC)
+       2452  82801E USB
+       2453  82801E SMBus
+       2459  82801E Ethernet Controller 0
+       245b  82801E IDE U100
+       245d  82801E Ethernet Controller 1
+       245e  82801E PCI Bridge
+       2480  82801CA ISA Bridge (LPC)
+       2482  82801CA/CAM USB (Hub #1)
+               1014 0220  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       2483  82801CA/CAM SMBus
+               1014 0220  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       2484  82801CA/CAM USB (Hub #2)
+               1014 0220  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       2485  82801CA/CAM AC'97 Audio
+               1014 0222  ThinkPad T23 (2647-4MG)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       2486  82801CA/CAM AC'97 Modem
+               1014 0223  ThinkPad A30p (2653-64G)
+               1014 0503  ThinkPad R31 2656BBG
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+               134d 4c21  Dell Inspiron 2100 internal modem
+       2487  82801CA/CAM USB (Hub #3)
+               1014 0220  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       248a  82801CAM IDE U100
+               1014 0220  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       248b  82801CA IDE U100
+       248c  82801CAM ISA Bridge (LPC)
+       24c0  82801DB ISA Bridge (LPC)
+       24c2  82801DB USB (Hub #1)
+       24c3  82801DB SMBus
+       24c4  82801DB USB (Hub #2)
+       24c5  82801DB AC'97 Audio
+       24c6  82801DB AC'97 Modem
+       24c7  82801DB USB (Hub #3)
+       24cb  82801DB ICH4 IDE
+       24cd  82801DB USB EHCI Controller
        2500  82820 820 (Camino) Chipset Host Bridge (MCH)
+               1028 0095  Precision Workstation 220 Chipset
                1043 801c  P3C-2000 system chipset
        2501  82820 820 (Camino) Chipset Host Bridge (MCH)
                1043 801c  P3C-2000 system chipset
        250b  82820 820 (Camino) Chipset Host Bridge
-       250f  82820 820 (Camino) Chipset PCI to AGP Bridge
+       250f  82820 820 (Camino) Chipset AGP Bridge
        2520  82805AA MTH Memory Translator Hub
        2521  82804AA MRH-S Memory Repeater Hub for SDRAM
        2530  82850 850 (Tehama) Chipset Host Bridge (MCH)
-       2531  82850 860 (Wombat) Chipset Host Bridge (MCH)
+               147b 0507  TH7II-RAID
+       2531  82860 860 (Wombat) Chipset Host Bridge (MCH)
        2532  82850 850 (Tehama) Chipset AGP Bridge
        2533  82860 860 (Wombat) Chipset AGP Bridge
+       2534  82860 860 (Wombat) Chipset PCI Bridge
+       2540  e7500 [Plumas] DRAM Controller
+       2541  e7500 [Plumas] DRAM Controller Error Reporting
+       2543  e7500 [Plumas] HI_B Virtual PCI Bridge (F0)
+       2544  e7500 [Plumas] HI_B Virtual PCI Bridge (F1)
+       2545  e7500 [Plumas] HI_C Virtual PCI Bridge (F0)
+       2546  e7500 [Plumas] HI_C Virtual PCI Bridge (F1)
+       2547  e7500 [Plumas] HI_D Virtual PCI Bridge (F0)
+       2548  e7500 [Plumas] HI_D Virtual PCI Bridge (F1)
+       2560  82845G/GL [Brookdale-G] Chipset Host Bridge
+       2561  82845G/GL [Brookdale-G] Chipset AGP Bridge
+       2562  82845G/GL [Brookdale-G] Chipset Integrated Graphics Device
        3092  Integrated RAID
+       3575  82830 830 Chipset Host Bridge
+               1014 021d  ThinkPad T23 (2647-4MG) or A30p (2653-64G)
+               104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+       3576  82830 830 Chipset AGP Bridge
+       3577  82830 CGC [Chipset Graphics Controller]
+       3578  82830 830 Chipset Host Bridge
        5200  EtherExpress PRO/100 Intelligent Server
        5201  EtherExpress PRO/100 Intelligent Server
                8086 0001  EtherExpress PRO/100 Server Ethernet Adapter
        7020  82371SB PIIX3 USB [Natoma/Triton II]
        7030  430VX - 82437VX TVX [Triton VX]
        7100  430TX - 82439TX MTXC
-       7110  82371AB PIIX4 ISA
-       7111  82371AB PIIX4 IDE
-       7112  82371AB PIIX4 USB
-       7113  82371AB PIIX4 ACPI
+       7110  82371AB/EB/MB PIIX4 ISA
+       7111  82371AB/EB/MB PIIX4 IDE
+       7112  82371AB/EB/MB PIIX4 USB
+       7113  82371AB/EB/MB PIIX4 ACPI
        7120  82810 GMCH [Graphics Memory Controller Hub]
        7121  82810 CGC [Chipset Graphics Controller]
-       7122  82810-DC100 GMCH [Graphics Memory Controller Hub]
-       7123  82810-DC100 CGC [Chipset Graphics Controller]
-       7124  82810E GMCH [Graphics Memory Controller Hub]
-       7125  82810E CGC [Chipset Graphics Controller]
-       7126  82810 810 Chipset Host Bridge and Memory Controller Hub
+       7122  82810 DC-100 GMCH [Graphics Memory Controller Hub]
+       7123  82810 DC-100 CGC [Chipset Graphics Controller]
+       7124  82810E DC-133 GMCH [Graphics Memory Controller Hub]
+       7125  82810E DC-133 CGC [Chipset Graphics Controller]
+       7126  82810 DC-133 System and Graphics Controller
+       7128  82810-M DC-100 System and Graphics Controller
+       712a  82810-M DC-133 System and Graphics Controller
        7180  440LX/EX - 82443LX/EX Host bridge
        7181  440LX/EX - 82443LX/EX AGP bridge
-       7190  440BX/ZX - 82443BX/ZX Host bridge
+       7190  440BX/ZX/DX - 82443BX/ZX/DX Host bridge
                0e11 0500  Armada 1750 Laptop System Chipset
-       7191  440BX/ZX - 82443BX/ZX AGP bridge
-       7192  440BX/ZX - 82443BX/ZX Host bridge (AGP disabled)
+               1179 0001  Toshiba Tecra 8100 Laptop System Chipset
+       7191  440BX/ZX/DX - 82443BX/ZX/DX AGP bridge
+       7192  440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
                0e11 0460  Armada 1700 Laptop System Chipset
-       7194  82440MX I/O Controller
+       7194  82440MX Host Bridge
        7195  82440MX AC'97 Audio Controller
                10cf 1099  QSound_SigmaTel Stac97 PCI Audio
                11d4 0040  SoundMAX Integrated Digital Audio
                11d4 0048  SoundMAX Integrated Digital Audio
-       7198  82440MX PCI to ISA Bridge
+       7196  82440MX AC'97 Modem Controller
+       7198  82440MX ISA Bridge
        7199  82440MX EIDE Controller
        719a  82440MX USB Universal Host Controller
        719b  82440MX Power Management Controller
        71a0  440GX - 82443GX Host bridge
        71a1  440GX - 82443GX AGP bridge
        71a2  440GX - 82443GX Host bridge (AGP disabled)
-       7600  82372FB PCI to ISA Bridge
-       7601  82372FB PIIX4 IDE
-       7602  82372FB [PCI-to-USB UHCI]
-       7603  82372FB System Management Bus Controller
+       7600  82372FB PIIX5 ISA
+       7601  82372FB PIIX5 IDE
+       7602  82372FB PIIX5 USB
+       7603  82372FB PIIX5 SMBus
        7800  i740
+               003d 0008  Starfighter AGP
+               003d 000b  Starfighter AGP
                1092 0100  Stealth II G460
+               10b4 201a  Lightspeed 740
+               10b4 202f  Lightspeed 740
+               8086 0000  Terminator 2x/i
                8086 0100  Intel740 Graphics Accelerator
        84c4  450KX/GX [Orion] - 82454KX/GX PCI bridge
        84c5  450KX/GX [Orion] - 82453KX/GX Memory controller
        84cb  450NX - 82454NX/84460GX PCI Expander Bridge
        84e0  460GX - 84460GX System Address Controller (SAC)
        84e1  460GX - 84460GX System Data Controller (SDC)
-       84e2  460GX - 84460GX AGP Bridge (GXB)
+       84e2  460GX - 84460GX AGP Bridge (GXB function 2)
        84e3  460GX - 84460GX Memory Address Controller (MAC)
        84e4  460GX - 84460GX Memory Data Controller (MDC)
+       84e6  460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)
+       84ea  460GX - 84460GX AGP Bridge (GXB function 1)
        9621  Integrated RAID
        9622  Integrated RAID
        9641  Integrated RAID
        96a1  Integrated RAID
+       b152  21152 PCI-to-PCI Bridge
+# observed, and documented in Intel revision note; new mask of 1011:0026
+       b154  21154 PCI-to-PCI Bridge
+       b555  21555 Non transparent PCI-to-PCI Bridge
+               e4bf 1000  CC8-1-BLUES
        ffff  450NX/GX [Orion] - 82453KX/GX Memory controller [BUG]
 8800  Trigem Computer Inc.
        2008  Video assistent component
        5278  AIC-7852
        5375  AIC-755x
        5378  AIC-7850
-       5475  AIC-2930
+       5475  AIC-755x
        5478  AIC-7850
        5575  AVA-2930
        5578  AIC-7855
+       5647  ANA-7711 TCP Offload Engine
        5675  AIC-755x
-       5678  AIC-7850
+       5678  AIC-7856
        5775  AIC-755x
        5778  AIC-7850
        5800  AIC-5800
        5905  ANA-5910A/5930A/5940A ATM Adapter
        6038  AIC-3860
        6075  AIC-1480 / APA-1480
+               9004 7560  AIC-1480 / APA-1480 Cardbus
        6078  AIC-7860
        6178  AIC-7861
                9004 7861  AHA-2940AU Single
        6278  AIC-7860
        6378  AIC-7860
-       6478  AIC-786
+       6478  AIC-786x
        6578  AIC-786x
-       6678  AIC-786
+       6678  AIC-786x
        6778  AIC-786x
        6915  ANA620xx/ANA69011A
                9004 0008  ANA69011A/TX 10/100
                9004 0009  ANA69011A/TX 10/100
                9004 0010  ANA62022 2-port 10/100
                9004 0018  ANA62044 4-port 10/100
+               9004 0019  ANA62044 4-port 10/100
                9004 0020  ANA62022 2-port 10/100
                9004 0028  ANA69011A/TX 10/100
                9004 8008  ANA69011A/TX 64 bit 10/100
                9004 8009  ANA69011A/TX 64 bit 10/100
                9004 8010  ANA62022 2-port 64 bit 10/100
                9004 8018  ANA62044 4-port 64 bit 10/100
+               9004 8019  ANA62044 4-port 64 bit 10/100
                9004 8020  ANA62022 2-port 64 bit 10/100
                9004 8028  ANA69011A/TX 64 bit 10/100
        7078  AHA-294x / AIC-7870
-       7178  AHA-294x / AIC-7871
-       7278  AHA-3940 / AIC-7872
+       7178  AHA-2940/2940W / AIC-7871
+       7278  AHA-3940/3940W / AIC-7872
        7378  AHA-3985 / AIC-7873
-       7478  AHA-2944 / AIC-7874
-# DJ: Where did the 3rd number come from?
-       7578  AHA-3944 / AHA-3944W / 7875
-# DJ: Where did the 3rd number come from?
-       7678  AHA-4944W/UW / 7876
+       7478  AHA-2944/2944W / AIC-7874
+       7578  AHA-3944/3944W / AIC-7875
+       7678  AHA-4944W/UW / AIC-7876
        7778  AIC-787x
        7810  AIC-7810
        7815  AIC-7815 RAID+Memory Controller IC
        7893  AIC-789x
        7894  AIC-789x
        7895  AHA-2940U/UW / AHA-39xx / AIC-7895
+               9004 7890  AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+               9004 7891  AHA-2940U/2940UW Dual
+               9004 7892  AHA-3940AU/AUW/AUWD/UWD
+               9004 7894  AHA-3944AUWD
                9004 7895  AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+               9004 7896  AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+               9004 7897  AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
        7896  AIC-789x
        7897  AIC-789x
        8078  AIC-7880U
                9004 7880  AIC-7880P Ultra/Ultra Wide SCSI Chipset
-       8178  AIC-7881U
+       8178  AHA-2940U/UW/D / AIC-7881U
                9004 7881  AHA-2940UW SCSI Host Adapter
-       8278  AHA-3940U/UW / AIC-7882U
+       8278  AHA-3940U/UW/UWD / AIC-7882U
        8378  AHA-3940U/UW / AIC-7883U
-       8478  AHA-294x / AIC-7884U
-       8578  AHA-3944U / AHA-3944UWD / 7885
-       8678  AHA-4944UW / 7886
-       8778  AIC-788x
+       8478  AHA-2944UW / AIC-7884U
+       8578  AHA-3944U/UWD / AIC-7885
+       8678  AHA-4944UW / AIC-7886
+       8778  AHA-2940UW Pro / AIC-788x
                9004 7887  2940UW Pro Ultra-Wide SCSI Controller
-       8878  7888
+       8878  AHA-2930UW / AIC-7888
+               9004 7888  AHA-2930UW SCSI Controller
        8b78  ABA-1030
        ec78  AHA-4944W/UW
 9005  Adaptec
-       0010  AHA-2940U2/W
-       0011  2930U2
+       0010  AHA-2940U2/U2W
+               9005 2180  AHA-2940U2 SCSI Controller
+               9005 8100  AHA-2940U2B SCSI Controller
+               9005 a180  AHA-2940U2W SCSI Controller
+               9005 e100  AHA-2950U2B SCSI Controller
+       0011  AHA-2930U2
        0013  78902
                9005 0003  AAA-131U2 Array1000 1 Channel RAID Controller
-       001f  AHA-2940U2/W / 7890
+       001f  AHA-2940U2/U2W / 7890/7891
                9005 000f  2940U2W SCSI Controller
                9005 a180  2940U2W SCSI Controller
        0020  AIC-7890
        002f  AIC-7890
        0030  AIC-7890
        003f  AIC-7890
-       0050  3940U2
-       0051  3950U2D
+       0050  AHA-3940U2x/395U2x
+               9005 f500  AHA-3950U2B
+       0051  AHA-3950U2D
+               9005 b500  AHA-3950U2D
        0053  AIC-7896 SCSI Controller
                9005 ffff  AIC-7896 SCSI Controller mainboard implementation
-       005f  7896
-       0080  7892A
-       0081  7892B
-       0083  7892D
-       008f  7892P
-       00c0  7899A
-       00c1  7899B
-       00c3  7899D
+       005f  AIC-7896U2/7897U2
+       0080  AIC-7892A U160/m
+               0e11 e2a0  Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter
+               9005 62a0  29160N Ultra160 SCSI Controller
+               9005 e220  29160LP Low Profile Ultra160 SCSI Controller
+               9005 e2a0  29160 Ultra160 SCSI Controller
+       0081  AIC-7892B U160/m
+               9005 62a1  19160 Ultra160 SCSI Controller
+       0083  AIC-7892D U160/m
+       008f  AIC-7892P U160/m
+       00c0  AHA-3960D / AIC-7899A U160/m
+               0e11 f620  Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter
+               9005 f620  AHA-3960D U160/m
+       00c1  AIC-7899B U160/m
+       00c3  AIC-7899D U160/m
        00c5  RAID subsystem HBA
-       00cf  7899P
+       00cf  AIC-7899P U160/m
+       0285  AAC-RAID
+               1028 0287  PowerEdge Expandable RAID Controller 320/DC
 907f  Atronics
        2015  IDE-2015PL
 919a  Gigapixel Corp
        6565  6565
 9699  Omni Media Technology Inc
        6565  6565
+9710  NetMos Technology
+       9815  VScom 021H-EP2 2 port parallel adaptor
+       9835  222N-2 I/O Card (2S+1P)
 a0a0  AOPEN Inc.
 a0f1  UNISYS Corporation
 a200  NEC Corporation
@@ -5263,16 +6562,33 @@ cafe  Chrysalis-ITS
 cccc  Catapult Communications
 d4d4  Dy4 Systems Inc
        0601  PCI Mezzanine Card
+d531  I+ME ACTIA GmbH
 d84d  Exsys
+dead  Indigita Corporation
 e000  Winbond
        e000  W89C940
 e159  Tiger Jet Network Inc.
        0001  Model 300 128k
                0059 0001  128k ISDN-S/T Adapter
                0059 0003  128k ISDN-U Adapter
+       0002  Tiger100APC ISDN chipset
 e4bf  EKF Elektronik GmbH
 ea01  Eagle Technology
 eabb  Aashima Technology B.V.
+eace  Endace Measurement Systems, Ltd
+       3100  DAG 3.10 OC-3/OC-12
+       3200  DAG 3.2x OC-3/OC-12
+       320e  DAG 3.2E Fast Ethernet
+       340e  DAG 3.4E Fast Ethernet
+       341e  DAG 3.41E Fast Ethernet
+       3500  DAG 3.5 OC-3/OC-12
+       351c  DAG 3.5ECM Fast Ethernet
+       4100  DAG 4.10 OC-48
+       4110  DAG 4.11 OC-48
+       4220  DAG 4.2 OC-48
+       422e  DAG 4.2E Dual Gigabit Ethernet
+ec80  Belkin Corporation
+       ec00  F5D6000
 ecc0  Echo Corporation
 edd8  ARK Logic Inc
        a091  1000PV [Stingray]
@@ -5280,6 +6596,7 @@ edd8  ARK Logic Inc
        a0a1  2000MT
        a0a9  2000MI
 fa57  Fast Search & Transfer ASA
+febd  Ultraview Corp.
 feda  Epigram Inc
 fffe  VMWare Inc
        0710  Virtual SVGA
@@ -5417,6 +6734,7 @@ C 0c  Serial bus controller
        03  USB Controller
                00  UHCI
                10  OHCI
+               20  EHCI
                80  Unspecified
                fe  USB Device
        04  Fibre Channel
index 3516d445e3406e971428ed12c7c989d72398f1b5..5e04ad7b33bbfe4954869be6bbd2ad3bff33358e 100644 (file)
@@ -369,7 +369,7 @@ static struct seq_operations proc_bus_pci_devices_op = {
        show:   show_device
 };
 
-static struct proc_dir_entry *proc_bus_pci_dir;
+struct proc_dir_entry *proc_bus_pci_dir;
 
 int pci_proc_attach_device(struct pci_dev *dev)
 {
index 5c06bb55a27ddfdb189cf24ba82f9cdd96dbb076..83aedecc9ec1938378789d988511ce36685ffc92 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/delay.h>
@@ -90,8 +90,8 @@ static void __init quirk_triton(struct pci_dev *dev)
  *     VIA Apollo KT133 needs PCI latency patch
  *     Made according to a windows driver based patch by George E. Breese
  *     see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm
- *      Also see http://home.tiscalinet.de/au-ja/review-kt133a-1-en.html for
- *      the info on which Mr Breese based his work.
+ *      Also see http://www.au-ja.org/review-kt133a-1-en.phtml for the info on which 
+ *     Mr Breese based his work.
  *
  *     Updated based on further information from the site and also on
  *     information provided by VIA 
@@ -444,13 +444,53 @@ static void __init quirk_amd_ioapic(struct pci_dev *dev)
 static void __init quirk_amd_ordering(struct pci_dev *dev)
 {
        u32 pcic;
-       
-       pci_read_config_dword(dev, 0x42, &pcic);
-       if((pcic&2)==0)
+       pci_read_config_dword(dev, 0x4C, &pcic);
+       if((pcic&6)!=6)
        {
-               pcic |= 2;
-               printk(KERN_WARNING "BIOS disabled PCI ordering compliance, so we enabled it again.\n");
-               pci_write_config_dword(dev, 0x42, pcic);                
+               pcic |= 6;
+               printk(KERN_WARNING "BIOS failed to enable PCI standards compliance, fixing this error.\n");
+               pci_write_config_dword(dev, 0x4C, pcic);
+               pci_read_config_dword(dev, 0x84, &pcic);
+               pcic |= (1<<23);        /* Required in this mode */
+               pci_write_config_dword(dev, 0x84, pcic);
+       }
+}
+
+/*
+ *     DreamWorks provided workaround for Dunord I-3000 problem
+ *
+ *     This card decodes and responds to addresses not apparently
+ *     assigned to it. We force a larger allocation to ensure that
+ *     nothing gets put too close to it.
+ */
+
+static void __init quirk_dunord ( struct pci_dev * dev )
+{
+       struct resource * r = & dev -> resource [ 1 ];
+       r -> start = 0;
+       r -> end = 0xffffff;
+}
+
+static void __init quirk_transparent_bridge(struct pci_dev *dev)
+{
+       dev->transparent = 1;
+}
+
+/*
+ * Common misconfiguration of the MediaGX/Geode PCI master that will
+ * reduce PCI bandwidth from 70MB/s to 25MB/s.  See the GXM/GXLV/GX1
+ * datasheets found at http://www.national.com/ds/GX for info on what
+ * these bits do.  <christer@weinigel.se>
+ */
+static void __init quirk_mediagx_master(struct pci_dev *dev)
+{
+       u8 reg;
+       pci_read_config_byte(dev, 0x41, &reg);
+       if (reg & 2) {
+               reg &= ~2;
+               printk(KERN_INFO "PCI: Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg);
+                pci_write_config_byte(dev, 0x41, reg);
        }
 }
 
@@ -459,6 +499,7 @@ static void __init quirk_amd_ordering(struct pci_dev *dev)
  */
 
 static struct pci_fixup pci_fixups[] __initdata = {
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_DUNORD,   PCI_DEVICE_ID_DUNORD_I3000,     quirk_dunord },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82441,      quirk_passive_release },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82441,      quirk_passive_release },
        /*
@@ -484,7 +525,7 @@ static struct pci_fixup pci_fixups[] __initdata = {
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_SI,       PCI_DEVICE_ID_SI_496,           quirk_nopcipci },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8363_0,       quirk_vialatency },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8371_1,       quirk_vialatency },
-       { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      0x3112  /* Not out yet ? */,    quirk_vialatency },
+       { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_8361, quirk_vialatency },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C576,       quirk_vsfx },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C597_0,     quirk_viaetbf },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C597_0,     quirk_vt82c598_id },
@@ -507,6 +548,15 @@ static struct pci_fixup pci_fixups[] __initdata = {
 
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_AMD,      PCI_DEVICE_ID_AMD_VIPER_7410,   quirk_amd_ioapic },
        { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_AMD,      PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering },
+       /*
+        * i82380FB mobile docking controller: its PCI-to-PCI bridge
+        * is subtractive decoding (transparent), and does indicate this
+        * in the ProgIf. Unfortunately, the ProgIf value is wrong - 0x80
+        * instead of 0x01.
+        */
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82380FB,    quirk_transparent_bridge },
+
+       { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_CYRIX,    PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master },
 
        { 0 }
 };
index 6a26a4ae8fef4dc0511451a40027e4d3f0609ded..22e70751711e2607ba47a8d188d83315b1278852 100644 (file)
 
 /*
  * Nov 2000, Ivan Kokshaysky <ink@jurassic.park.msu.ru>
- *          PCI-PCI bridges cleanup, sorted resource allocation
+ *          PCI-PCI bridges cleanup, sorted resource allocation.
+ * Feb 2002, Ivan Kokshaysky <ink@jurassic.park.msu.ru>
+ *          Converted to allocation in 3 passes, which gives
+ *          tighter packing. Prefetchable range support.
  */
 
 #include <linux/init.h>
@@ -23,7 +26,7 @@
 #include <linux/slab.h>
 
 
-#define DEBUG_CONFIG 0
+#define DEBUG_CONFIG 1
 #if DEBUG_CONFIG
 # define DBGC(args)     printk args
 #else
 #define ROUND_UP(x, a)         (((x) + (a) - 1) & ~((a) - 1))
 
 static int __init
-pbus_assign_resources_sorted(struct pci_bus *bus,
-                            struct pbus_set_ranges_data *ranges)
+pbus_assign_resources_sorted(struct pci_bus *bus)
 {
        struct list_head *ln;
        struct resource *res;
-       struct resource_list head_io, head_mem, *list, *tmp;
-       unsigned long io_reserved = 0, mem_reserved = 0;
+       struct resource_list head, *list, *tmp;
        int idx, found_vga = 0;
 
-       head_io.next = head_mem.next = NULL;
+       head.next = NULL;
        for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {
                struct pci_dev *dev = pci_dev_b(ln);
                u16 class = dev->class >> 8;
@@ -64,63 +65,26 @@ pbus_assign_resources_sorted(struct pci_bus *bus,
                        pci_write_config_word(dev, PCI_COMMAND, cmd);
                }
 
-               /* Reserve some resources for CardBus.
-                  Are these values reasonable? */
-               if (class == PCI_CLASS_BRIDGE_CARDBUS) {
-                       io_reserved += 8*1024;
-                       mem_reserved += 32*1024*1024;
-                       continue;
-               }
-
-               pdev_sort_resources(dev, &head_io, IORESOURCE_IO);
-               pdev_sort_resources(dev, &head_mem, IORESOURCE_MEM);
+               pdev_sort_resources(dev, &head);
        }
 
-       for (list = head_io.next; list;) {
+       for (list = head.next; list;) {
                res = list->res;
                idx = res - &list->dev->resource[0];
-               if (pci_assign_resource(list->dev, idx) == 0
-                   && ranges->io_end < res->end)
-                       ranges->io_end = res->end;
+               pci_assign_resource(list->dev, idx);
                tmp = list;
                list = list->next;
                kfree(tmp);
        }
-       for (list = head_mem.next; list;) {
-               res = list->res;
-               idx = res - &list->dev->resource[0];
-               if (pci_assign_resource(list->dev, idx) == 0
-                   && ranges->mem_end < res->end)
-                       ranges->mem_end = res->end;
-               tmp = list;
-               list = list->next;
-               kfree(tmp);
-       }
-
-       ranges->io_end += io_reserved;
-       ranges->mem_end += mem_reserved;
-
-       /* PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998)
-          requires that if there is no I/O ports or memory behind the
-          bridge, corresponding range must be turned off by writing base
-          value greater than limit to the bridge's base/limit registers.  */
-#if 1
-       /* But assuming that some hardware designed before 1998 might
-          not support this (very unlikely - at least all DEC bridges
-          are ok and I believe that was standard de-facto. -ink), we
-          must allow for at least one unit.  */
-       if (ranges->io_end == ranges->io_start)
-               ranges->io_end += 1;
-       if (ranges->mem_end == ranges->mem_start)
-               ranges->mem_end += 1;
-#endif
-       ranges->io_end = ROUND_UP(ranges->io_end, 4*1024);
-       ranges->mem_end = ROUND_UP(ranges->mem_end, 1024*1024);
 
        return found_vga;
 }
 
-/* Initialize bridges with base/limit values we have collected */
+/* Initialize bridges with base/limit values we have collected.
+   PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998)
+   requires that if there is no I/O ports or memory behind the
+   bridge, corresponding range must be turned off by writing base
+   value greater than limit to the bridge's base/limit registers.  */
 static void __init
 pci_setup_bridge(struct pci_bus *bus)
 {
@@ -130,120 +94,307 @@ pci_setup_bridge(struct pci_bus *bus)
 
        if (!bridge || (bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI)
                return;
+
        ranges.io_start = bus->resource[0]->start;
        ranges.io_end = bus->resource[0]->end;
        ranges.mem_start = bus->resource[1]->start;
        ranges.mem_end = bus->resource[1]->end;
+       ranges.prefetch_start = bus->resource[2]->start;
+       ranges.prefetch_end = bus->resource[2]->end;
        pcibios_fixup_pbus_ranges(bus, &ranges);
 
-       DBGC((KERN_ERR "PCI: Bus %d, bridge: %s\n", bus->number, bridge->name));
-       DBGC((KERN_ERR "  IO window: %04lx-%04lx\n", ranges.io_start, ranges.io_end));
-       DBGC((KERN_ERR "  MEM window: %08lx-%08lx\n", ranges.mem_start, ranges.mem_end));
+       DBGC((KERN_INFO "PCI: Bus %d, bridge: %s\n",
+                       bus->number, bridge->name));
 
        /* Set up the top and bottom of the PCI I/O segment for this bus. */
-       pci_read_config_dword(bridge, PCI_IO_BASE, &l);
-       l &= 0xffff0000;
-       l |= (ranges.io_start >> 8) & 0x00f0;
-       l |= ranges.io_end & 0xf000;
+       if (bus->resource[0]->flags & IORESOURCE_IO) {
+               pci_read_config_dword(bridge, PCI_IO_BASE, &l);
+               l &= 0xffff0000;
+               l |= (ranges.io_start >> 8) & 0x00f0;
+               l |= ranges.io_end & 0xf000;
+               /* Set up upper 16 bits of I/O base/limit. */
+               pci_write_config_word(bridge, PCI_IO_BASE_UPPER16,
+                                     ranges.io_start >> 16);
+               pci_write_config_word(bridge, PCI_IO_LIMIT_UPPER16,
+                                     ranges.io_end >> 16);
+               DBGC((KERN_INFO "  IO window: %04lx-%04lx\n",
+                               ranges.io_start, ranges.io_end));
+       }
+       else {
+               /* Clear upper 16 bits of I/O base/limit. */
+               pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, 0);
+               l = 0x00f0;
+               DBGC((KERN_INFO "  IO window: disabled.\n"));
+       }
        pci_write_config_dword(bridge, PCI_IO_BASE, l);
 
-       /* Clear upper 16 bits of I/O base/limit. */
-       pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, 0);
+       /* Set up the top and bottom of the PCI Memory segment
+          for this bus. */
+       if (bus->resource[1]->flags & IORESOURCE_MEM) {
+               l = (ranges.mem_start >> 16) & 0xfff0;
+               l |= ranges.mem_end & 0xfff00000;
+               DBGC((KERN_INFO "  MEM window: %08lx-%08lx\n",
+                               ranges.mem_start, ranges.mem_end));
+       }
+       else {
+               l = 0x0000fff0;
+               DBGC((KERN_INFO "  MEM window: disabled.\n"));
+       }
+       pci_write_config_dword(bridge, PCI_MEMORY_BASE, l);
 
        /* Clear out the upper 32 bits of PREF base/limit. */
        pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 0);
        pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, 0);
 
-       /* Set up the top and bottom of the PCI Memory segment
-          for this bus. */
-       l = (ranges.mem_start >> 16) & 0xfff0;
-       l |= ranges.mem_end & 0xfff00000;
-       pci_write_config_dword(bridge, PCI_MEMORY_BASE, l);
-
        /* Set up PREF base/limit. */
-       l = (bus->resource[2]->start >> 16) & 0xfff0;
-       l |= bus->resource[2]->end & 0xfff00000;
+       if (bus->resource[2]->flags & IORESOURCE_PREFETCH) {
+               l = (ranges.prefetch_start >> 16) & 0xfff0;
+               l |= ranges.prefetch_end & 0xfff00000;
+               DBGC((KERN_INFO "  PREFETCH window: %08lx-%08lx\n",
+                               ranges.prefetch_start, ranges.prefetch_end));
+       }
+       else {
+               l = 0x0000fff0;
+               DBGC((KERN_INFO "  PREFETCH window: disabled.\n"));
+       }
        pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l);
 
        /* Check if we have VGA behind the bridge.
-          Enable ISA in either case. */
+          Enable ISA in either case (FIXME!). */
        l = (bus->resource[0]->flags & IORESOURCE_BUS_HAS_VGA) ? 0x0c : 0x04;
        pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, l);
 }
 
+/* Check whether the bridge supports optional I/O and
+   prefetchable memory ranges. If not, the respective
+   base/limit registers must be read-only and read as 0. */
 static void __init
-pbus_assign_resources(struct pci_bus *bus, struct pbus_set_ranges_data *ranges)
+pci_bridge_check_ranges(struct pci_bus *bus)
+{
+       u16 io;
+       u32 pmem;
+       struct pci_dev *bridge = bus->self;
+       struct resource *b_res;
+
+       if (!bridge || (bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI)
+               return;
+
+       b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
+       b_res[1].flags |= IORESOURCE_MEM;
+
+       pci_read_config_word(bridge, PCI_IO_BASE, &io);
+       if (!io) {
+               pci_write_config_word(bridge, PCI_IO_BASE, 0xf0f0);
+               pci_read_config_word(bridge, PCI_IO_BASE, &io);
+               pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
+       }
+       if (io)
+               b_res[0].flags |= IORESOURCE_IO;
+       /*  DECchip 21050 pass 2 errata: the bridge may miss an address
+           disconnect boundary by one PCI data phase.
+           Workaround: do not use prefetching on this device. */
+       if (bridge->vendor == PCI_VENDOR_ID_DEC && bridge->device == 0x0001)
+               return;
+       pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem);
+       if (!pmem) {
+               pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE,
+                                              0xfff0fff0);
+               pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem);
+               pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, 0x0);
+       }
+       if (pmem)
+               b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH;
+}
+
+/* Sizing the IO windows of the PCI-PCI bridge is trivial,
+   since these windows have 4K granularity and the IO ranges
+   of non-bridge PCI devices are limited to 256 bytes.
+   We must be careful with the ISA aliasing though. */
+static void __init
+pbus_size_io(struct pci_bus *bus)
 {
        struct list_head *ln;
-       int found_vga = pbus_assign_resources_sorted(bus, ranges);
+       struct resource *b_res = bus->resource[0];
+       unsigned long size = 0, size1 = 0;
 
-       if (!ranges->found_vga && found_vga) {
-               struct pci_bus *b;
+       if (!(b_res->flags & IORESOURCE_IO))
+               return;
 
-               ranges->found_vga = 1;
-               /* Propogate presence of the VGA to upstream bridges */
-               for (b = bus; b->parent; b = b->parent) {
-#if 0
-                       /* ? Do we actually need to enable PF memory? */
-                       b->resource[2]->start = 0;
+       for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {
+               struct pci_dev *dev = pci_dev_b(ln);
+               int i;
+               
+               for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+                       struct resource *r = &dev->resource[i];
+                       unsigned long r_size;
+
+                       if (r->parent || !(r->flags & IORESOURCE_IO))
+                               continue;
+                       r_size = r->end - r->start + 1;
+
+                       if (r_size < 0x400)
+                               /* Might be re-aligned for ISA */
+                               size += r_size;
+                       else
+                               size1 += r_size;
+               }
+               /* ??? Reserve some resources for CardBus. */
+               if ((dev->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS)
+                       size1 += 4*1024;
+       }
+/* To be fixed in 2.5: we should have sort of HAVE_ISA
+   flag in the struct pci_bus. */
+#if defined(CONFIG_ISA) || defined(CONFIG_EISA)
+       size = (size & 0xff) + ((size & ~0xffUL) << 2);
 #endif
-                       b->resource[0]->flags |= IORESOURCE_BUS_HAS_VGA;
+       size = ROUND_UP(size + size1, 4096);
+       if (!size) {
+               b_res->flags = 0;
+               return;
+       }
+       /* Alignment of the IO window is always 4K */
+       b_res->start = 4096;
+       b_res->end = b_res->start + size - 1;
+}
+
+/* Calculate the size of the bus and minimal alignment which
+   guarantees that all child resources fit in this size. */
+static void __init
+pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type)
+{
+       struct list_head *ln;
+       unsigned long min_align, align, size;
+       unsigned long aligns[12];       /* Alignments from 1Mb to 2Gb */
+       int order, max_order;
+       struct resource *b_res = (type & IORESOURCE_PREFETCH) ?
+                                bus->resource[2] : bus->resource[1];
+
+       memset(aligns, 0, sizeof(aligns));
+       max_order = 0;
+       size = 0;
+
+       for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {
+               struct pci_dev *dev = pci_dev_b(ln);
+               int i;
+               
+               for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+                       struct resource *r = &dev->resource[i];
+                       unsigned long r_size;
+
+                       if (r->parent || (r->flags & mask) != type)
+                               continue;
+                       r_size = r->end - r->start + 1;
+                       /* For bridges size != alignment */
+                       align = (i < PCI_BRIDGE_RESOURCES) ? r_size : r->start;
+                       order = ffz(~align) - 20;
+                       if (order > 11) {
+                               printk(KERN_WARNING "PCI: region %s/%d "
+                                      "too large: %lx-%lx\n",
+                                      dev->slot_name, i, r->start, r->end);
+                               r->flags = 0;
+                               continue;
+                       }
+                       size += r_size;
+                       if (order < 0)
+                               order = 0;
+                       /* Exclude ranges with size > align from
+                          calculation of the alignment. */
+                       if (size == align)
+                               aligns[order] += align;
+                       if (order > max_order)
+                               max_order = order;
+               }
+               /* ??? Reserve some resources for CardBus. */
+               if ((dev->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {
+                       size += 1UL << 24;              /* 16 Mb */
+                       aligns[24 - 20] += 1UL << 24;
                }
        }
-       for (ln=bus->children.next; ln != &bus->children; ln=ln->next) {
-               struct pci_bus *b = pci_bus_b(ln);
 
-               b->resource[0]->start = ranges->io_start = ranges->io_end;
-               b->resource[1]->start = ranges->mem_start = ranges->mem_end;
+       align = 0;
+       min_align = 0;
+       for (order = 0; order <= max_order; order++) {
+               unsigned long align1 = 1UL << (order + 20);
+
+               if (!align)
+                       min_align = align1;
+               else if (ROUND_UP(align + min_align, min_align) < align1)
+                       min_align = align1 >> 1;
+               align += aligns[order];
+       }
+       size = ROUND_UP(size, min_align);
+       if (!size) {
+               b_res->flags = 0;
+               return;
+       }
+       b_res->start = min_align;
+       b_res->end = size + min_align - 1;
+}
 
-               pbus_assign_resources(b, ranges);
+void __init
+pbus_size_bridges(struct pci_bus *bus)
+{
+       struct list_head *ln;
+       unsigned long mask, type;
 
-               b->resource[0]->end = ranges->io_end - 1;
-               b->resource[1]->end = ranges->mem_end - 1;
+       for (ln=bus->children.next; ln != &bus->children; ln=ln->next)
+               pbus_size_bridges(pci_bus_b(ln));
 
-               pci_setup_bridge(b);
+       /* The root bus? */
+       if (!bus->self)
+               return;
+
+       pci_bridge_check_ranges(bus);
+
+       pbus_size_io(bus);
+
+       mask = type = IORESOURCE_MEM;
+       /* If the bridge supports prefetchable range, size it separately. */
+       if (bus->resource[2] &&
+           bus->resource[2]->flags & IORESOURCE_PREFETCH) {
+               pbus_size_mem(bus, IORESOURCE_PREFETCH, IORESOURCE_PREFETCH);
+               mask |= IORESOURCE_PREFETCH;    /* Size non-prefetch only. */
        }
+       pbus_size_mem(bus, mask, type);
 }
 
 void __init
-pci_assign_unassigned_resources(void)
+pbus_assign_resources(struct pci_bus *bus)
 {
-       struct pbus_set_ranges_data ranges;
        struct list_head *ln;
-       struct pci_dev *dev;
+       int found_vga = pbus_assign_resources_sorted(bus);
 
-       for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) {
-               struct pci_bus *b = pci_bus_b(ln);
+       if (found_vga) {
+               struct pci_bus *b;
 
-               ranges.io_start = b->resource[0]->start + PCIBIOS_MIN_IO;
-               ranges.mem_start = b->resource[1]->start + PCIBIOS_MIN_MEM;
-               ranges.io_end = ranges.io_start;
-               ranges.mem_end = ranges.mem_start;
-               ranges.found_vga = 0;
-               pbus_assign_resources(b, &ranges);
+               /* Propagate presence of the VGA to upstream bridges */
+               for (b = bus; b->parent; b = b->parent) {
+                       b->resource[0]->flags |= IORESOURCE_BUS_HAS_VGA;
+               }
        }
-       pci_for_each_dev(dev) {
-               pdev_enable_device(dev);
+       for (ln=bus->children.next; ln != &bus->children; ln=ln->next) {
+               struct pci_bus *b = pci_bus_b(ln);
+
+               pbus_assign_resources(b);
+               pci_setup_bridge(b);
        }
 }
 
-/* Check whether the bridge supports I/O forwarding.
-   If not, its I/O base/limit register must be
-   read-only and read as 0. */
-unsigned long __init
-pci_bridge_check_io(struct pci_dev *bridge)
+void __init
+pci_assign_unassigned_resources(void)
 {
-       u16 io;
+       struct list_head *ln;
+       struct pci_dev *dev;
 
-       pci_read_config_word(bridge, PCI_IO_BASE, &io);
-       if (!io) {
-               pci_write_config_word(bridge, PCI_IO_BASE, 0xf0f0);
-               pci_read_config_word(bridge, PCI_IO_BASE, &io);
-               pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
+       /* Depth first, calculate sizes and alignments of all
+          subordinate buses. */
+       for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next)
+               pbus_size_bridges(pci_bus_b(ln));
+       /* Depth last, allocate resources and update the hardware. */
+       for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next)
+               pbus_assign_resources(pci_bus_b(ln));
+
+       pci_for_each_dev(dev) {
+               pdev_enable_device(dev);
        }
-       if (io)
-               return IORESOURCE_IO;
-       printk(KERN_WARNING "PCI: bridge %s does not support I/O forwarding!\n",
-                               bridge->name);
-       return 0;
 }
index 57932fbf11570efe0b3edeae8ce246e2b242b5c7..1053ad5489c7c867699451be547587f22d18e745 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 #include <linux/init.h>
-//#include <linux/kernel.h>
+/*#include <linux/kernel.h>*/
 #include <linux/pci.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
@@ -69,6 +69,7 @@ static int pci_assign_bus_resource(const struct pci_bus *bus,
        unsigned int type_mask,
        int resno)
 {
+       unsigned long align;
        int i;
 
        type_mask |= IORESOURCE_IO | IORESOURCE_MEM;
@@ -81,12 +82,20 @@ static int pci_assign_bus_resource(const struct pci_bus *bus,
                if ((res->flags ^ r->flags) & type_mask)
                        continue;
 
-               /* We cannot allocate a non-prefetching resource from a pre-fetching area */
-               if ((r->flags & IORESOURCE_PREFETCH) && !(res->flags & IORESOURCE_PREFETCH))
+               /* We cannot allocate a non-prefetching resource
+                  from a pre-fetching area */
+               if ((r->flags & IORESOURCE_PREFETCH) &&
+                   !(res->flags & IORESOURCE_PREFETCH))
                        continue;
 
+               /* The bridge resources are special, as their
+                  size != alignment. Sizing routines return
+                  required alignment in the "start" field. */
+               align = (resno < PCI_BRIDGE_RESOURCES) ? size : res->start;
+
                /* Ok, try it out.. */
-               if (allocate_resource(r, res, size, min, -1, size, pcibios_align_resource, dev) < 0)
+               if (allocate_resource(r, res, size, min, -1, align,
+                                     pcibios_align_resource, dev) < 0)
                        continue;
 
                /* Update PCI config space.  */
@@ -127,47 +136,45 @@ pci_assign_resource(struct pci_dev *dev, int i)
        return 0;
 }
 
-/* Sort resources of a given type by alignment */
+/* Sort resources by alignment */
 void __init
-pdev_sort_resources(struct pci_dev *dev,
-                   struct resource_list *head, u32 type_mask)
+pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
 {
        int i;
 
        for (i = 0; i < PCI_NUM_RESOURCES; i++) {
                struct resource *r;
                struct resource_list *list, *tmp;
-               unsigned long r_size;
-
-               /* PCI-PCI bridges may have I/O ports or
-                  memory on the primary bus */
-               if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI &&
-                                               i >= PCI_BRIDGE_RESOURCES)
-                       continue;
+               unsigned long r_align;
 
                r = &dev->resource[i];
-               r_size = r->end - r->start;
+               r_align = r->end - r->start;
                
-               if (!(r->flags & type_mask) || r->parent)
+               if (!(r->flags) || r->parent)
                        continue;
-               if (!r_size) {
+               if (!r_align) {
                        printk(KERN_WARNING "PCI: Ignore bogus resource %d "
-                                        "[%lx:%lx] of %s\n",
-                                         i, r->start, r->end, dev->name);
+                                           "[%lx:%lx] of %s\n",
+                                           i, r->start, r->end, dev->name);
                        continue;
                }
+               r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start;
                for (list = head; ; list = list->next) {
-                       unsigned long size = 0;
+                       unsigned long align = 0;
                        struct resource_list *ln = list->next;
+                       int idx;
 
-                       if (ln)
-                               size = ln->res->end - ln->res->start;
-                       if (r_size > size) {
+                       if (ln) {
+                               idx = ln->res - &ln->dev->resource[0];
+                               align = (idx < PCI_BRIDGE_RESOURCES) ?
+                                       ln->res->end - ln->res->start + 1 :
+                                       ln->res->start;
+                       }
+                       if (r_align > align) {
                                tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
-                               if (!tmp) {
-                                       printk(KERN_ERR "pdev_sort_resources(): kmalloc() failed!\n");
-                                       continue;
-                               }
+                               if (!tmp)
+                                       panic("pdev_sort_resources(): "
+                                             "kmalloc() failed!\n");
                                tmp->next = ln;
                                tmp->res = r;
                                tmp->dev = dev;
index b5007e38a103766ff966ddf51b055a389e85b6d4..474cc9591ae1d82e2fc9939db3f4072804c7aac2 100644 (file)
@@ -31,7 +31,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <asm/scatterlist.h>
-//#include <linux/string.h>
+/*#include <linux/string.h>*/
 #include <asm/io.h>
 
 struct pci_dev;
@@ -73,9 +73,8 @@ static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
                                        size_t size, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        flush_write_buffers();
-
        return virt_to_bus(ptr);
 }
 
@@ -90,38 +89,38 @@ static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
                                    size_t size, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        /* Nothing to do */
 }
 
 /*
  * pci_{map,unmap}_single_page maps a kernel page to a dma_addr_t. identical
- * to pci_map_single, but takes a struct page instead of a virtual address
+ * to pci_map_single, but takes a struct pfn_info instead of a virtual address
  */
 static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct pfn_info *page,
                                      unsigned long offset, size_t size, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
 
-       return (page - frame_table) * PAGE_SIZE + offset;
+       return (dma_addr_t)(page - frame_table) * PAGE_SIZE + offset;
 }
 
 static inline void pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
                                  size_t size, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        /* Nothing to do */
 }
 
 /* pci_unmap_{page,single} is a nop so... */
 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
 #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-#define pci_unmap_addr(PTR, ADDR_NAME)          (0)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
-#define pci_unmap_len(PTR, LEN_NAME)            (0)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)   do { } while (0)
+#define pci_unmap_addr(PTR, ADDR_NAME)         (0)
+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)        do { } while (0)
+#define pci_unmap_len(PTR, LEN_NAME)           (0)
+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)  do { } while (0)
 
 /* Map a set of buffers described by scatterlist in streaming
  * mode for DMA.  This is the scather-gather version of the
@@ -144,16 +143,16 @@ static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
        int i;
 
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
  
        /*
         * temporary 2.4 hack
         */
        for (i = 0; i < nents; i++ ) {
                if (sg[i].address && sg[i].page)
-                       BUG();
+                       out_of_line_bug();
                else if (!sg[i].address && !sg[i].page)
-                       BUG();
+                       out_of_line_bug();
  
                if (sg[i].address)
                        sg[i].dma_address = virt_to_bus(sg[i].address);
@@ -173,7 +172,7 @@ static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
                                int nents, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        /* Nothing to do */
 }
 
@@ -191,7 +190,7 @@ static inline void pci_dma_sync_single(struct pci_dev *hwdev,
                                       size_t size, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        flush_write_buffers();
 }
 
@@ -206,7 +205,7 @@ static inline void pci_dma_sync_sg(struct pci_dev *hwdev,
                                   int nelems, int direction)
 {
        if (direction == PCI_DMA_NONE)
-               BUG();
+               out_of_line_bug();
        flush_write_buffers();
 }
 
@@ -272,6 +271,12 @@ static inline int pci_controller_num(struct pci_dev *dev)
        return 0;
 }
 
+#if 0 /* XXX Not in land of Xen XXX */
+#define HAVE_PCI_MMAP
+extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+                              enum pci_mmap_state mmap_state, int write_combine);
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif /* __i386_PCI_H */
index d9ffb1d95d97818258aa24d8d782651fafd93054..07b031e71ff2468553be86b8bbbc963524b94c97 100644 (file)
 #ifndef __ASSEMBLY__
 extern unsigned long opt_ipbase, opt_nfsserv, opt_gateway, opt_netmask;
 extern unsigned char opt_nfsroot[];
+extern void __out_of_line_bug(int line) __attribute__((noreturn));
+#define out_of_line_bug() __out_of_line_bug(__LINE__)
 #endif
 
 #endif /* __XENO_CONFIG_H__ */
index 7c3569949684240c958069f8e70f42ad22212c5f..0416edc71eda156da1a4379962a857768d5d8923 100644 (file)
@@ -92,7 +92,8 @@ extern int allocate_resource(struct resource *root, struct resource *new,
                             unsigned long size,
                             unsigned long min, unsigned long max,
                             unsigned long align,
-                            void (*alignf)(void *, struct resource *, unsigned long),
+                            void (*alignf)(void *, struct resource *,
+                                           unsigned long, unsigned long),
                             void *alignf_data);
 
 /* Convenience shorthand with allocation */
index d477afeb4b7daaa60ea284d3314c0d60394e01c0..8902b27fffa78a719e10e55d7e75374ff23d400c 100644 (file)
@@ -376,12 +376,15 @@ struct pci_dev {
        struct resource dma_resource[DEVICE_COUNT_DMA];
        struct resource irq_resource[DEVICE_COUNT_IRQ];
 
-       char            name[80];       /* device name */
+       char            name[90];       /* device name */
        char            slot_name[8];   /* slot name */
        int             active;         /* ISAPnP: device is active */
        int             ro;             /* ISAPnP: read only */
        unsigned short  regs;           /* ISAPnP: supported registers */
 
+       /* These fields are used by common fixups */
+       unsigned short  transparent:1;  /* Transparent PCI bridge */
+
        int (*prepare)(struct pci_dev *dev);    /* ISAPnP hooks */
        int (*activate)(struct pci_dev *dev);
        int (*deactivate)(struct pci_dev *dev);
@@ -436,6 +439,7 @@ struct pci_bus {
 extern struct list_head pci_root_buses;        /* list of all known PCI buses */
 extern struct list_head pci_devices;   /* list of all devices */
 
+extern struct proc_dir_entry *proc_bus_pci_dir;
 /*
  * Error values that may be returned by PCI functions.
  */
@@ -460,9 +464,9 @@ struct pci_ops {
 
 struct pbus_set_ranges_data
 {
-       int found_vga;
        unsigned long io_start, io_end;
        unsigned long mem_start, mem_end;
+       unsigned long prefetch_start, prefetch_end;
 };
 
 struct pci_device_id {
@@ -479,7 +483,7 @@ struct pci_driver {
        int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);   /* New device inserted */
        void (*remove) (struct pci_dev *dev);   /* Device removed (NULL if not a hot-plug capable driver) */
        int  (*save_state) (struct pci_dev *dev, u32 state);    /* Save Device Context */
-       int  (*suspend)(struct pci_dev *dev, u32 state);        /* Device suspended */
+       int  (*suspend) (struct pci_dev *dev, u32 state);       /* Device suspended */
        int  (*resume) (struct pci_dev *dev);                   /* Device woken up */
        int  (*enable_wake) (struct pci_dev *dev, u32 state, int enable);   /* Enable wake event */
 };
@@ -493,11 +497,12 @@ struct pci_driver {
 
 void pcibios_init(void);
 void pcibios_fixup_bus(struct pci_bus *);
-int pcibios_enable_device(struct pci_dev *);
+int pcibios_enable_device(struct pci_dev *, int mask);
 char *pcibios_setup (char *str);
 
 /* Used only when drivers/pci/setup.c is used */
-void pcibios_align_resource(void *, struct resource *, unsigned long);
+void pcibios_align_resource(void *, struct resource *,
+                           unsigned long, unsigned long);
 void pcibios_update_resource(struct pci_dev *, struct resource *,
                             struct resource *, int);
 void pcibios_update_irq(struct pci_dev *, int irq);
@@ -559,6 +564,7 @@ int pci_write_config_word(struct pci_dev *dev, int where, u16 val);
 int pci_write_config_dword(struct pci_dev *dev, int where, u32 val);
 
 int pci_enable_device(struct pci_dev *dev);
+int pci_enable_device_bars(struct pci_dev *dev, int mask);
 void pci_disable_device(struct pci_dev *dev);
 void pci_set_master(struct pci_dev *dev);
 #define HAVE_PCI_SET_MWI
@@ -580,13 +586,15 @@ int pci_enable_wake(struct pci_dev *dev, u32 state, int enable);
 int pci_claim_resource(struct pci_dev *, int);
 void pci_assign_unassigned_resources(void);
 void pdev_enable_device(struct pci_dev *);
-void pdev_sort_resources(struct pci_dev *, struct resource_list *, u32);
+void pdev_sort_resources(struct pci_dev *, struct resource_list *);
 unsigned long pci_bridge_check_io(struct pci_dev *);
 void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
                    int (*)(struct pci_dev *, u8, u8));
-#define HAVE_PCI_REQ_REGIONS
+#define HAVE_PCI_REQ_REGIONS   2
 int pci_request_regions(struct pci_dev *, char *);
 void pci_release_regions(struct pci_dev *);
+int pci_request_region(struct pci_dev *, int, char *);
+void pci_release_region(struct pci_dev *, int);
 
 /* New-style probing supporting hot-pluggable devices */
 int pci_register_driver(struct pci_driver *);
@@ -650,6 +658,7 @@ unsigned int ss_vendor, unsigned int ss_device, const struct pci_dev *from)
 { return NULL; }
 
 static inline void pci_set_master(struct pci_dev *dev) { }
+static inline int pci_enable_device_bars(struct pci_dev *dev, int mask) { return -EBUSY; }
 static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
 static inline void pci_disable_device(struct pci_dev *dev) { }
 static inline int pci_module_init(struct pci_driver *drv) { return -ENODEV; }